Sí, Array.map () o $ .map () hace lo mismo.
//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/
Dado que array.map no es compatible con navegadores antiguos, le sugiero que siga con el método jQuery.
Si prefiere el otro por alguna razón, siempre puede agregar un polyfill para el soporte antiguo del navegador.
Siempre puede agregar métodos personalizados al prototipo de matriz también:
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;
});
Una versión extendida que usa el constructor de funciones si pasa una cadena. Algo para jugar, tal vez:
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/
Actualizar:
Como esta se ha convertido en una respuesta tan popular, agrego mi where()
+ similar firstOrDefault()
. Estos también podrían usarse con el enfoque del constructor de funciones basado en cadenas (que es el más rápido), pero aquí hay otro enfoque que usa un objeto literal como filtro:
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;
};
Uso:
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' });
Aquí hay una prueba de jsperf para comparar el constructor de funciones frente a la velocidad literal del objeto. Si decide usar el primero, recuerde citar las cadenas correctamente.
Mi preferencia personal es usar las soluciones basadas en literales de objeto al filtrar 1-2 propiedades, y pasar una función de devolución de llamada para un filtrado más complejo.
Terminaré esto con 2 consejos generales al agregar métodos a los prototipos de objetos nativos:
Verifique la existencia de métodos existentes antes de sobrescribir, por ejemplo:
if(!Array.prototype.where) {
Array.prototype.where = ...
Si no necesita admitir IE8 y versiones posteriores, defina los métodos con Object.defineProperty para que no se puedan enumerar . Si alguien usó for..in
en una matriz (lo cual es incorrecto en primer lugar), también iterará propiedades enumerables. Solo un aviso.
return typeof item[property] === 'function' ? item[property]() === filter[property] : item[property] === filter[property];
return ko.unwrap(item[property]) === filter[property]
?Sé que es una respuesta tardía, ¡pero me fue útil! Solo para completar, usando la
$.grep
función puedes emular el linqwhere()
.Linq:
Javascript:
fuente
Dado que está utilizando la función de eliminación, debe considerar usar la función de utilidad de eliminación
arrayMap()
y sus otras funciones de utilidad de matriz.Aquí hay una lista de funciones de utilidad de matriz y sus métodos LINQ equivalentes:
Entonces, lo que podría hacer en su ejemplo es esto:
Si desea una interfaz similar a LINQ en javascript, puede usar una biblioteca como linq.js que ofrece una buena interfaz para muchos de los métodos LINQ.
fuente
La forma ES6:
también en: https://jsfiddle.net/52dpucey/
fuente
También puedes probar
linq.js
En
linq.js
suestarán
fuente
He creado una biblioteca de Linq para TypeScript en TsLinq.codeplex.com que también puede usar para JavaScript simple. Esa biblioteca es 2-3 veces más rápida que Linq.js y contiene pruebas unitarias para todos los métodos de Linq. Tal vez podrías revisar eso.
fuente
Eche un vistazo a underscore.js que proporciona muchas funciones similares a linq. En el ejemplo que le daría, usaría la función de mapa.
fuente
Puede probar el
manipula
paquete, que implementa todos los métodos de C # LINQ y guarda su sintaxis: https://github.com/litichevskiydv/manipulahttps://www.npmjs.com/package/manipula
Su ejemplo
selectedFruits.select(fruit=>fruit.id);
se implementará con manipula comofuente
Dinqyjs tiene una sintaxis tipo linq y proporciona polyfills para funciones como map e indexOf, y ha sido diseñado específicamente para trabajar con matrices en Javascript.
fuente
Eche un vistazo a fluido , es compatible con casi todo lo que hace LINQ y se basa en iterables, por lo que funciona con mapas, funciones de generador, matrices, todo iterable.
fuente
El análogo de C # más similar
Select
sería unamap
función. Solo usa:para seleccionar todos los identificadores de la
selectedFruits
matriz.No requiere dependencias externas, solo JavaScript puro. Puede encontrar
map
documentación aquí: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/mapfuente
Estoy respondiendo el título de la pregunta en lugar de la pregunta original que era más específica.
Con las nuevas características de Javascript como iteradores y funciones y objetos del generador, es posible algo como LINQ for Javascript. Tenga en cuenta que linq.js, por ejemplo, utiliza un enfoque completamente diferente, utilizando expresiones regulares, probablemente para superar la falta de soporte en el idioma en ese momento.
Dicho esto, he escrito una biblioteca LINQ para Javascript y puede encontrarla en https://github.com/Siderite/LInQer . Comentarios y discusión en https://siderite.dev/blog/linq-in-javascript-linqer .
De las respuestas anteriores, solo Manipula parece ser lo que uno esperaría de un puerto LINQ en Javascript.
fuente