Waarom neemt Array.prototype.reduce() geen lege array als accumulator?

Ik probeer alle elementen in een array die groter zijn dan 10 te filteren naar een nieuwe array. Ik gebruik met opzet Array.prototype.filter()niet omdat ik de methode reduce()wil leren. Hier is de code waarmee ik aan het spelen was

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);
  }
}, []);

Snippet uitvouwen


Antwoord 1, autoriteit 100%

Wanneer u probeert om return filteredArr.push(collectionElement)terug te geven, geeft u in wezen de lengte van filteredArr terug na de push-bewerking. De methode push() voegt een of meer elementen toe aan het einde van een array en retourneert de nieuwe lengte van de array.
Ref: Array.prototype.push().

U moet de filteredArrvan uw anonieme functie retourneren, zodat deze wordt gebruikt als de previousValuevoor de volgende oproep

var collection = [3, 5, 11, 23, 1];
// filter all the elements bigger than 10 to a new array
var output = collection.reduce(function(filteredArr, collectionElement) {
  if (collectionElement > 10) {
    filteredArr.push(collectionElement);
  }
  return filteredArr;
}, []);

Antwoord 2, autoriteit 16%

Array.prototype.pushretourneert de lengte van de nieuwe array. U dient de accu terug te sturen. Een beknopte manier om dit te doen is met Array.prototype.concat, aangezien die methode de array daadwerkelijk teruggeeft:

var collection = [3, 5, 11, 23, 1];
var output = collection.reduce(function(filteredArr, collectionElemet) {
  if (collectionElemet > 10) {
    return filteredArr.concat(collectionElemet);
  }
}, []);

Je moet de accumulator teruggeven zodat de volgende iteratie de waarde van de accumulator kan gebruiken.

Other episodes