web-dev-qa-db-fra.com

Pourquoi Array.prototype.reduce () ne prend pas un tableau vide comme accumulateur?

J'essaie de filtrer tous les éléments d'un tableau qui sont supérieurs à 10 dans un nouveau tableau. Je n'utilise pas intentionnellement Array.prototype.filter() car je veux apprendre la méthode reduce(). Voici le code avec lequel je jouais

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

Je m'attendais à ce que filteredArr soit initialisé avec un tableau vide au moment de la première exécution de rappel, comme cela se produit avec de nombreux exemples fournis ici . Mais lorsque j'exécute ce code, j'obtiens l'erreur Cannot read property 'Push' of undefined, où est-ce que je me trompe? Je vous remercie!

35
segmentationfaulter

Lorsque vous essayez de faire return filteredArr.Push(collectionElement), vous renvoyez essentiellement la longueur de filterArr après l'opération Push. La méthode Push () ajoute un ou plusieurs éléments à la fin d'un tableau et renvoie la nouvelle longueur du tableau. Réf: Array.prototype.Push () .

Vous devez renvoyer le filteredArr de votre fonction anonyme, afin qu'il soit utilisé comme previousValue pour le prochain appel

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

Array.prototype.Push renverra la longueur du nouveau tableau. Vous devez retourner l'accumulateur. Une façon succincte de le faire est avec Array.prototype.concat, puisque cette méthode retournera en fait le tableau:

var collection = [3, 5, 11, 23, 1];

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

Vous devez retourner l'accumulateur pour que la prochaine itération puisse utiliser la valeur de l'accumulateur.

9
Josh Beam