Oui, Array.map () ou $ .map () fait la même chose.
//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/
Puisque array.map n'est pas pris en charge dans les navigateurs plus anciens, je vous suggère de vous en tenir à la méthode jQuery.
Si vous préférez l'autre pour une raison quelconque, vous pouvez toujours ajouter un polyfill pour le support des anciens navigateurs.
Vous pouvez également ajouter des méthodes personnalisées au prototype de tableau:
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;
});
Une version étendue qui utilise le constructeur de fonction si vous passez une chaîne. Quelque chose pour jouer avec peut-être:
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/
Mettre à jour:
Puisque cela est devenu une réponse si populaire, j'ajoute mon where()
+ similaire firstOrDefault()
. Ceux-ci pourraient également être utilisés avec l'approche du constructeur de fonction basée sur une chaîne (qui est la plus rapide), mais voici une autre approche utilisant un littéral d'objet comme filtre:
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;
};
Usage:
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' });
Voici un test jsperf pour comparer le constructeur de fonction à la vitesse littérale de l'objet. Si vous décidez d'utiliser l'ancien, n'oubliez pas de citer correctement les chaînes.
Ma préférence personnelle est d'utiliser les solutions basées sur l'objet littéral lors du filtrage de 1 à 2 propriétés et de transmettre une fonction de rappel pour un filtrage plus complexe.
Je terminerai cela avec 2 conseils généraux lors de l'ajout de méthodes à des prototypes d'objets natifs:
Vérifiez l'occurrence des méthodes existantes avant d'écraser, par exemple:
if(!Array.prototype.where) {
Array.prototype.where = ...
Si vous n'avez pas besoin de prendre en charge IE8 et les versions antérieures , définissez les méthodes en utilisant Object.defineProperty pour les rendre non énumérables. Si quelqu'un a utilisé for..in
sur un tableau (ce qui est faux en premier lieu), il itérera également des propriétés énumérables. Juste un avertissement.
return typeof item[property] === 'function' ? item[property]() === filter[property] : item[property] === filter[property];
return ko.unwrap(item[property]) === filter[property]
?Je sais que c'est une réponse tardive mais cela m'a été utile! Juste pour terminer, en utilisant la
$.grep
fonction, vous pouvez émuler le linqwhere()
.Linq:
Javascript:
la source
Puisque vous utilisez knockout, vous devriez envisager d'utiliser la fonction utilitaire knockout
arrayMap()
et ses autres fonctions utilitaires de tableau.Voici une liste des fonctions de l'utilitaire de tableau et de leurs méthodes LINQ équivalentes:
Donc, ce que vous pourriez faire dans votre exemple est ceci:
Si vous voulez une interface de type LINQ en javascript, vous pouvez utiliser une bibliothèque telle que linq.js qui offre une interface agréable à de nombreuses méthodes LINQ.
la source
La manière ES6:
également sur: https://jsfiddle.net/52dpucey/
la source
Vous pouvez également essayer
linq.js
Dans
linq.js
votresera
la source
J'ai construit une bibliothèque Linq pour TypeScript sous TsLinq.codeplex.com que vous pouvez également utiliser pour du javascript brut. Cette bibliothèque est 2 à 3 fois plus rapide que Linq.js et contient des tests unitaires pour toutes les méthodes Linq. Vous pourriez peut-être revoir celui-là.
la source
Jetez un coup d'œil à underscore.js qui fournit de nombreuses fonctions de type linq. Dans l'exemple que vous donnez, vous utiliseriez la fonction de carte.
la source
Vous pouvez essayer le
manipula
package, qui implémente toutes les méthodes C # LINQ et enregistre sa syntaxe: https://github.com/litichevskiydv/manipulahttps://www.npmjs.com/package/manipula
Votre exemple
selectedFruits.select(fruit=>fruit.id);
sera implémenté avec manipula commela source
Dinqyjs a une syntaxe de type linq et fournit des polyfills pour des fonctions comme map et indexOf, et a été spécialement conçu pour travailler avec des tableaux en Javascript.
la source
Jetez un œil à fluent , il prend en charge presque tout ce que fait LINQ et basé sur des itérables - il fonctionne donc avec des cartes, des fonctions de générateur, des tableaux, tout ce qui est itérable.
la source
L'analogue C # le plus similaire
Select
serait unemap
fonction. Utilisez simplement:pour sélectionner tous les identifiants du
selectedFruits
tableau.Il ne nécessite aucune dépendance externe, juste du JavaScript pur. Vous pouvez trouver la
map
documentation ici: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/mapla source
Je réponds au titre de la question plutôt qu'à la question initiale qui était plus précise.
Avec les nouvelles fonctionnalités de Javascript comme les itérateurs et les fonctions et objets de générateur, quelque chose comme LINQ pour Javascript devient possible. Notez que linq.js, par exemple, utilise une approche complètement différente, utilisant des expressions régulières, probablement pour pallier le manque de support dans le langage à l'époque.
Cela étant dit, j'ai écrit une bibliothèque LINQ pour Javascript et vous pouvez la trouver sur https://github.com/Siderite/LInQer . Commentaires et discussion sur https://siderite.dev/blog/linq-in-javascript-linqer .
D'après les réponses précédentes, seul Manipula semble être ce que l'on attend d'un port LINQ en Javascript.
la source