web-dev-qa-db-fra.com

Utilisation de la fonction de réduction pour retourner un tableau

Pourquoi est-ce que lorsque je veux utiliser la fonction Push dans la fonction de réduction pour renvoyer un nouveau tableau, une erreur se produit? Cependant, lorsque j'utilise la méthode concat dans la fonction de réduction, elle retourne un nouveau tableau sans problème.

Tout ce que j'essaie de faire est de passer un tableau à la fonction de réduction et de renvoyer le même tableau.

var store = [0,1,2,3,4];

var stored = store.reduce(function(pV,cV,cI){
  console.log("pv: ", pV);
  return pV.Push(cV);
},[]);

Cela renvoie une erreur. Mais quand j'utilise concat: 

var store = [0,1,2,3,4];

var stored = store.reduce(function(pV,cV,cI){
  console.log("pv: ", pV);
  return pV.concat(cV);
},[]);

Il retourne le même tableau.

Des idées pourquoi?

21
2K01B5

Push renvoie la nouvelle longueur du tableau.

Ce dont vous avez besoin est le tableau fourni initialement.

Alors changez le code comme ci-dessous.

var store = [0, 1, 2, 3, 4];

var stored = store.reduce(function(pV, cV, cI){
  console.log("pv: ", pV);
  pV.Push(cV);
  return pV; // *********  Important ******
}, []);

concat renvoie le nouveau tableau combinant les éléments du tableau fourni et des éléments concaténés. alors ça marche.

39
Venkata Raju

Par souci d’exhaustivité, et pour la personne suivante sur cette question, ce que vous faites est généralement réalisé avec map qui, comme indiqué dans la documentation

map appelle une fonction de rappel fournie une fois pour chaque élément d'un tableau, dans l'ordre, et construit un nouveau tableau à partir des résultats

Comparez cela avec la description de reduce :

La méthode reduction () applique une fonction sur un accumulateur et sur chaque valeur du tableau (de gauche à droite) pour le réduire à une valeur unique.

Donc, bien que vous pouvez manipuliez reduce pour renvoyer un nouveau tableau, il est d'usage courant de réduire un tableau à une valeur unique.

Donc pour votre code ce serait:

var store = [0,1,2,3,4];

var stored = store.map(function(pV){
  console.log("pv: ", pV);
  return pV;
});

Beaucoup plus simple que d'essayer de reconstruire un nouveau tableau en utilisant Push ou concat dans une fonction reduce.

12
Jamiec

Array.prototype.Push method retourne la nouvelle longueur du tableau. 

Array.prototype.concat method insère un nouvel élément dans un tableau et renvoie le tableau afin qu’il puisse être traité ultérieurement. C’est ce que vous devez faire avec une réduction: passer un tableau modifié à la prochaine itération.

1
dfsq

la réduction peut être utile si vous devez renvoyer un tableau contenant plusieurs éléments pour chaque élément itéré.

var inputs = media.reduce((passedArray, video) => { passedArray.Push("-i"); passedArray.Push(video.filepath); return passedArray; }, []);

Ici, il est utilisé pour construire le tableau en entrée pour ffmpeg;

[{nom: "bob", chemin du fichier: "1.mp4"}, {nom: "sue", chemin du fichier: "3.mp4"}]

=> ["-i", "1.mp4", "-i", "2.mp4]

0
abitofcode