Да, Array.map () или $ .map () делает то же самое.
//array.map:
var ids = this.fruits.map(function(v){
return v.Id;
});
//jQuery.map:
var ids2 = $.map(this.fruits, function (v){
return v.Id;
});
console.log(ids, ids2);
http://jsfiddle.net/NsCXJ/1/
Так как array.map не поддерживается в старых браузерах, я предлагаю придерживаться метода jQuery.
Если вы по какой-то причине предпочитаете другой, вы всегда можете добавить полифилл для поддержки старого браузера.
Вы всегда можете добавить собственные методы в прототип массива:
Array.prototype.select = function(expr){
var arr = this;
//do custom stuff
return arr.map(expr); //or $.map(expr);
};
var ids = this.fruits.select(function(v){
return v.Id;
});
Расширенная версия, которая использует конструктор функции, если вы передаете строку. Возможно, с этим можно поиграть:
Array.prototype.select = function(expr){
var arr = this;
switch(typeof expr){
case 'function':
return $.map(arr, expr);
break;
case 'string':
try{
var func = new Function(expr.split('.')[0],
'return ' + expr + ';');
return $.map(arr, func);
}catch(e){
return null;
}
break;
default:
throw new ReferenceError('expr not defined or not supported');
break;
}
};
console.log(fruits.select('x.Id'));
http://jsfiddle.net/aL85j/
Обновить:
Так как это стало таким популярным ответом, я добавляю похожие мои where()
+ firstOrDefault()
. Они также могут быть использованы с подходом конструктора функции на основе строки (который является самым быстрым), но здесь есть другой подход, использующий литерал объекта в качестве фильтра:
Array.prototype.where = function (filter) {
var collection = this;
switch(typeof filter) {
case 'function':
return $.grep(collection, filter);
case 'object':
for(var property in filter) {
if(!filter.hasOwnProperty(property))
continue; // ignore inherited properties
collection = $.grep(collection, function (item) {
return item[property] === filter[property];
});
}
return collection.slice(0); // copy the array
// (in case of empty object filter)
default:
throw new TypeError('func must be either a' +
'function or an object of properties and values to filter by');
}
};
Array.prototype.firstOrDefault = function(func){
return this.where(func)[0] || null;
};
Использование:
var persons = [{ name: 'foo', age: 1 }, { name: 'bar', age: 2 }];
// returns an array with one element:
var result1 = persons.where({ age: 1, name: 'foo' });
// returns the first matching item in the array, or null if no match
var result2 = persons.firstOrDefault({ age: 1, name: 'foo' });
Вот тест jsperf для сравнения конструктора функции и скорости литерала объекта. Если вы решили использовать первое, имейте в виду, что строки должны быть указаны правильно.
Лично я предпочитаю использовать решения на основе литералов объектов при фильтрации 1-2 свойств и передавать функцию обратного вызова для более сложной фильтрации.
Я закончу это двумя общими советами при добавлении методов к собственным прототипам объектов:
Проверьте наличие существующих методов перед перезаписью, например:
if(!Array.prototype.where) {
Array.prototype.where = ...
Если вам не нужно поддерживать IE8 и ниже, определите методы, используя Object.defineProperty, чтобы сделать их не перечисляемыми. Если кто-то использует for..in
массив (что, в первую очередь, неверно), он также будет перебирать перечисляемые свойства. Просто один на один.
return typeof item[property] === 'function' ? item[property]() === filter[property] : item[property] === filter[property];
return ko.unwrap(item[property]) === filter[property]
?Я знаю, что это поздний ответ, но он был полезен для меня! Просто для завершения, используя
$.grep
функцию, вы можете эмулировать linqwhere()
.Linq:
Javascript:
источник
Поскольку вы используете knockout, вам следует рассмотреть возможность использования утилиты knockout
arrayMap()
и ее других утилит массива.Вот список функций утилит массива и их эквивалентных методов LINQ:
Итак, что вы могли бы сделать в своем примере это:
Если вам нужен интерфейс, похожий на LINQ, в javascript, вы можете использовать библиотеку, такую как linq.js, которая предлагает хороший интерфейс для многих методов LINQ.
источник
ES6 способ:
также по адресу: https://jsfiddle.net/52dpucey/
источник
Вы также можете попробовать
linq.js
В
linq.js
вашембудет
источник
Я создал библиотеку Linq для TypeScript в TsLinq.codeplex.com, которую вы также можете использовать для простого javascript. Эта библиотека в 2-3 раза быстрее Linq.js и содержит модульные тесты для всех методов Linq. Может быть, вы могли бы рассмотреть это.
источник
Взгляните на underscore.js, который предоставляет много linq-подобных функций. В приведенном вами примере вы использовали бы функцию карты.
источник
Вы можете попробовать
manipula
пакет, который реализует все методы C # LINQ и сохраняет его синтаксис: https://github.com/litichevskiydv/manipulahttps://www.npmjs.com/package/manipula
Ваш пример
selectedFruits.select(fruit=>fruit.id);
будет реализован с манипулой какисточник
Dinqyjs имеет синтаксис, похожий на linq, и обеспечивает полифилы для таких функций, как map и indexOf, и был специально разработан для работы с массивами в Javascript.
источник
Взгляните на бегло , он поддерживает почти все, что делает LINQ и основан на итерируемости - так что он работает с картами, функциями генератора, массивами, всем итеративным.
источник
Наиболее похожим
Select
аналогом C # будетmap
функция. Просто используйте:выбрать все идентификаторы из
selectedFruits
массива.Не требует никаких внешних зависимостей, только чистый JavaScript. Вы можете найти
map
документацию здесь: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/mapисточник
Я отвечаю на название вопроса, а не на исходный вопрос, который был более конкретным.
Благодаря новым возможностям Javascript, таким как итераторы, функции и объекты-генераторы, становится возможным что-то вроде LINQ for Javascript. Обратите внимание, что linq.js, например, использует совершенно другой подход, используя регулярные выражения, вероятно, чтобы преодолеть отсутствие поддержки в языке в то время.
Учитывая это, я написал библиотеку LINQ для Javascript, и вы можете найти ее по адресу https://github.com/Siderite/LInQer . Комментарии и обсуждение на https://siderite.dev/blog/linq-in-javascript-linqer .
Из предыдущих ответов только Manipula кажется тем, чего можно ожидать от порта LINQ в Javascript.
источник