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