Ja, Array.map () oder $ .map () machen dasselbe.
//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/
Da array.map in älteren Browsern nicht unterstützt wird, sollten Sie sich an die jQuery-Methode halten.
Wenn Sie aus irgendeinem Grund die andere bevorzugen, können Sie jederzeit eine Polyfüllung für die Unterstützung alter Browser hinzufügen.
Sie können dem Array-Prototyp auch jederzeit benutzerdefinierte Methoden hinzufügen:
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;
});
Eine erweiterte Version, die den Funktionskonstruktor verwendet, wenn Sie eine Zeichenfolge übergeben. Vielleicht etwas zum Herumspielen:
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/
Aktualisieren:
Da dies eine so beliebte Antwort geworden ist, füge ich ähnlich mein where()
+ hinzu firstOrDefault()
. Diese können auch mit dem String-basierten Funktionskonstruktor-Ansatz (der am schnellsten ist) verwendet werden. Hier ist jedoch ein anderer Ansatz, bei dem ein Objektliteral als Filter verwendet wird:
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;
};
Verwendung:
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' });
Hier ist ein jsperf-Test , um den Funktionskonstruktor mit der Objektliteralgeschwindigkeit zu vergleichen. Wenn Sie sich für Ersteres entscheiden, denken Sie daran, Zeichenfolgen korrekt zu zitieren.
Meine persönliche Präferenz ist es, beim Filtern von 1-2 Eigenschaften die auf Objektliteral basierenden Lösungen zu verwenden und eine Rückruffunktion für eine komplexere Filterung zu übergeben.
Ich werde dies mit zwei allgemeinen Tipps beenden, wenn Sie Methoden zu nativen Objektprototypen hinzufügen:
Überprüfen Sie vor dem Überschreiben, ob vorhandene Methoden vorhanden sind, z.
if(!Array.prototype.where) {
Array.prototype.where = ...
Wenn Sie IE8 und niedriger nicht unterstützen müssen, definieren Sie die Methoden mit Object.defineProperty , um sie nicht aufzählbar zu machen. Wenn jemand for..in
ein Array verwendet (was an erster Stelle falsch ist), iteriert er auch aufzählbare Eigenschaften. Nur ein Kopf hoch.
return typeof item[property] === 'function' ? item[property]() === filter[property] : item[property] === filter[property];
return ko.unwrap(item[property]) === filter[property]
?Ich weiß, dass es eine späte Antwort ist, aber es war nützlich für mich! Zum Abschluss können Sie mit der
$.grep
Funktion die Linq emulierenwhere()
.Linq:
Javascript:
quelle
Da Sie Knockout verwenden, sollten Sie die Knockout-Dienstprogrammfunktion
arrayMap()
und andere Array-Dienstprogrammfunktionen in Betracht ziehen .Hier ist eine Liste der Array-Dienstprogrammfunktionen und ihrer entsprechenden LINQ-Methoden:
In Ihrem Beispiel könnten Sie also Folgendes tun:
Wenn Sie eine LINQ-ähnliche Schnittstelle in Javascript möchten, können Sie eine Bibliothek wie linq.js verwenden, die eine schöne Schnittstelle zu vielen der LINQ-Methoden bietet.
quelle
Der ES6-Weg:
auch unter: https://jsfiddle.net/52dpucey/
quelle
Sie können es auch versuchen
linq.js
In
linq.js
deinemwird sein
quelle
Ich habe unter TsLinq.codeplex.com eine Linq-Bibliothek für TypeScript erstellt , die Sie auch für einfaches Javascript verwenden können. Diese Bibliothek ist 2-3 mal schneller als Linq.js und enthält Unit-Tests für alle Linq-Methoden. Vielleicht könnten Sie das überprüfen.
quelle
Werfen Sie einen Blick auf underscore.js , das viele linq-ähnliche Funktionen bietet. In dem Beispiel, das Sie geben, würden Sie die Kartenfunktion verwenden.
quelle
Sie können das
manipula
Paket ausprobieren , das alle C # LINQ-Methoden implementiert und dessen Syntax speichert: https://github.com/litichevskiydv/manipulahttps://www.npmjs.com/package/manipula
Ihr Beispiel
selectedFruits.select(fruit=>fruit.id);
wird mit manipula as implementiertquelle
Dinqyjs hat eine linq-ähnliche Syntax und bietet Polyfills für Funktionen wie map und indexOf. Es wurde speziell für die Arbeit mit Arrays in Javascript entwickelt.
quelle
Schauen Sie sich fließend an , es unterstützt fast alles, was LINQ tut und basiert auf iterablen Elementen - es funktioniert also mit Karten, Generatorfunktionen, Arrays und allem, was iterierbar ist.
quelle
Das ähnlichste C #
Select
-Analogon wäre einemap
Funktion. Benutz einfach:um alle IDs auszuwählen
selectedFruits
Array .Es sind keine externen Abhängigkeiten erforderlich, nur reines JavaScript.
map
Dokumentation finden Sie hier: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/mapquelle
Ich beantworte eher den Titel der Frage als die ursprünglichere Frage, die spezifischer war.
Mit den neuen Funktionen von Javascript wie Iteratoren und Generatorfunktionen und -objekten wird so etwas wie LINQ für Javascript möglich. Beachten Sie, dass linq.js beispielsweise einen völlig anderen Ansatz verwendet und reguläre Ausdrücke verwendet, um wahrscheinlich den Mangel an Unterstützung in der Sprache zu überwinden.
Nachdem dies gesagt wurde, habe ich eine LINQ-Bibliothek für Javascript geschrieben, die Sie unter https://github.com/Siderite/LInQer finden . Kommentare und Diskussion unter https://siderite.dev/blog/linq-in-javascript-linqer .
Von früheren Antworten scheint nur Manipula das zu sein, was man von einem LINQ-Port in Javascript erwarten würde.
quelle