Ich versuche, alle Elemente in einem Array, die größer als 10 sind, zu einem neuen Array zu filtern. Ich verwende absichtlich nicht Array.prototype.filter()
, da ich die reduce()
Methode erlernen möchte. Hier ist der Code, ich spiele mitWarum nimmt Array.prototype.reduce() kein leeres Array als Akkumulator an?
var collection = [3, 5, 11, 23, 1];
// fileter all the elements bigger than 10 to a new array
var output = collection.reduce(function(filteredArr, collectionElemet) {
if (collectionElemet > 10) {
return filteredArr.push(collectionElemet);
}
}, []);
Ich hatte erwartet, dass filteredArr
würde zum Zeitpunkt der ersten Rückruf Ausführung mit einem leeren Array initialisiert werden, da es mit vielen Beispielen geschieht here zur Verfügung gestellt. Aber wenn ich diesen Code ausführen, bekomme ich den Fehler Cannot read property 'push' of undefined
, wo ich es vermasseln? Vielen Dank!
Wenn die Bedingung wahr ist - Sie geben eine Zahl zurück, wenn sie nicht wahr ist - geben Sie ein 'undefined' zurück. Wenn Sie nur filtern wollen - verwenden Sie 'Array.prototype.filter ', ist Ihr aktueller Code so, wie er ist, hässlich und irreführend. – zerkms
@zerkms: Das ist fair für Produktionscode, nicht für Bildung/Experimente. Das OP stellt klar, dass er über "Filter" Bescheid weiß, aber versucht "Reduce" zu verstehen. – Amadan
@Amadan dann ist es ein schwacher Versuch: es macht Sinn zu versuchen, Funktionen zu verstehen, die Usecases verwenden, für die sie entworfen wurden. – zerkms