Ich habe ein Array von Objekten, über die ich iterieren möchte, um ein neues gefiltertes Array zu erstellen. Aber ich muss auch einige der Objekte aus dem neuen Array herausfiltern, abhängig von einem Parameter. Ich versuche das:
function renderOptions(options) {
return options.map(function (option) {
if (!option.assigned) {
return (someNewObject);
}
});
}
Ist das ein guter Ansatz? Gibt es eine bessere Methode? Ich bin offen für jede Bibliothek wie lodash.
javascript
arrays
Daniel Calderon Mori
quelle
quelle
.reduce()
ist definitiv schneller als ein,.filter(...).map(...)
was ich anderswo vorgeschlagen habe. Ich habe einen JSPerf-Test eingerichtet, um stackoverflow.com/a/47877054/2379922Antworten:
Sie sollten dafür verwenden
Array.reduce
.Alternativ kann der Reduzierer eine reine Funktion sein
quelle
filtered
ein Objekt. sofiltered.push
ist für mich undefiniert.filtered
, ein Objekt zu sein. Dies lag daran, dass ich den "Anfangswert" - das leere Array ([]
) nach der Reduktionsfunktion - nicht übergeben habe. zB falschvar reduced = options.reduce(function(filtered, option) { ... });
richtigvar reduced = options.reduce(function(filtered, option) { ... }, []);
reduce
, den Sie genauso gut verwenden könnten,forEach
da Sie bei jeder Iteration das Array ändernfiltered
und es daher nicht rein funktional ist. Es wäre Ereignis lesbarer und kompakter.Verwenden Sie reduzieren, Luke!
quelle
Array.prototype.flatMap ist seit 2019 eine gute Option.
Von der oben verlinkten MDN-Seite:
quelle
flatMap
kürzlich eingeführt wurde und die Browserunterstützung begrenzt ist . Möglicherweise möchten Sie die offiziellen Polyfill / Shims verwenden: flatMap und flat .Mit ES6 können Sie es sehr kurz machen:
options.filter(opt => !opt.assigned).map(opt => someNewObject)
quelle
Eine Zeile
reduce
mit ausgefallener ES6- Spread-Syntax ist da!quelle
result
... ist wie einefilter(assigned).map(name)
Lösung...assigned ? [name] : []
- es ist vielleicht besser lesbar als...(assigned ? [name] : [])
Ich würde einen Kommentar abgeben, aber ich habe nicht den erforderlichen Ruf. Eine kleine Verbesserung der ansonsten sehr guten Antwort von Maxim Kuzmin, um sie effizienter zu machen:
Erläuterung
Anstatt das gesamte Ergebnis für jede Iteration immer wieder zu verteilen, hängen wir nur an das Array an und nur dann, wenn tatsächlich ein Wert eingefügt werden muss.
quelle
Verwenden Sie Array.prototy.filter selbst
quelle
Ist es nicht irgendwann einfacher (oder genauso einfach), a zu verwenden?
forEach
Es wäre jedoch schön, wenn es eine
malter()
oderfap()
Funktion gäbe , die diemap
undfilter
Funktionen kombiniert . Es würde wie ein Filter funktionieren, außer dass anstelle von true oder false ein beliebiges Objekt oder ein null / undefined zurückgegeben wird.quelle
Ich habe die Antworten mit folgenden Punkten optimiert:
if (cond) { stmt; }
alscond && stmt;
Ich werde zwei Lösungen vorstellen, eine mit forEach , die andere mit reduct :
Lösung 1: Verwenden von forEach
Lösung 2: Verwenden Sie Reduzieren
Ich überlasse es Ihnen, zu entscheiden, für welche Lösung Sie sich entscheiden.
quelle
cond && stmt;
? Dies ist viel schwieriger zu lesen und bietet überhaupt keine Vorteile.Mit reduzieren können Sie dies in einer Array.prototype-Funktion tun. Dadurch werden alle geraden Zahlen aus einem Array abgerufen.
Sie können dieselbe Methode verwenden und sie für Ihre Objekte wie folgt verallgemeinern.
arr
enthält nun die gefilterten Objekte.quelle
Direkte Verwendung von
.reduce
kann schwer zu lesen sein, daher würde ich empfehlen, eine Funktion zu erstellen, die den Reduzierer für Sie generiert:Verwenden Sie es so:
quelle