En étudiant la méthode de réduction, je ne sais pas trop pourquoi le rappel transmis nécessite les troisième et quatrième paramètres, index et tableau. Dans l'exemple du MDN:

[0, 1, 2, 3, 4].reduce(function(previousValue, currentValue, index, array) {
  return previousValue + currentValue;
});

Beaucoup d'autres utilisations de la méthode de réduction de tableau ou de la fonction de réduction de soulignement que j'ai étudiées n'utilisent que les deux premiers paramètres pour callback: previousValue (parfois vu comme accumulator) et currentValue (aka elem, la valeur de l'index actuel).

Pourquoi réduire parfois écrit avec callback prenant quatre paramètres et parfois écrit avec seulement previousValue et currentValue?

Dans quel cas les paramètres index et array sont-ils nécessaires?

Les quatre paramètres doivent-ils toujours être donnés dans une définition de fonction pour réduire au cas où une application de réduire nécessite le troisième ou le quatrième paramètre?

2
phizzy 13 juil. 2015 à 08:07

2 réponses

Meilleure réponse

Voici un exemple (légèrement) moins artificiel pour résumer les valeurs uniques dans un tableau, en ignorant les doublons, en utilisant les arguments index et array pour trouver des valeurs uniques:

[0, 1, 2, 3, 2, 1, 0].reduce(function(previousValue, currentValue, index, array) {
  return array.indexOf(currentValue) === index ? // value used already?
         previousValue + currentValue :  // not used yet, add to sum
         previousValue; // used already, skip currentValue
}); // == 6  ( 0+1+2+3 )

Démo en direct: http://pagedemos.com/fn764n659ama/1/

Note complémentaire: [] .reduce () s'exécute un peu plus vite dans V8 en spécifiant les quatre arguments comme paramètres formels sur le rappel, qu'ils soient utilisés par le code à l'intérieur de la fonction.

2
dandavis 13 juil. 2015 à 06:02

Si vous n'avez besoin d'utiliser que les deux premiers paramètres, il est parfaitement normal de laisser les deux derniers dans la liste des arguments de la fonction. Dans ce cas, les deux derniers arguments seront simplement ignorés. Pour résumer le tableau, c'est une manière parfaitement acceptable de le faire:

[0, 1, 2, 3, 4].reduce(function(previousValue, currentValue) {
  return previousValue + currentValue;
});

Les deux derniers paramètres, index et array vous donnent simplement des informations supplémentaires au cas où vous en auriez besoin. Par exemple, supposons que vous vouliez additionner tous les éléments du tableau multipliés par leur élément miroir, c'est-à-dire étant donné le tableau [0, 1, 2, 3, 4] que vous vouliez générer

(0 * 4) + (1 * 3) + (2 * 2) + (3 * 1) + (4 * 0)

Alors vous devrez utiliser les deux derniers paramètres:

[0, 1, 2, 3, 4].reduce(function(previousValue, currentValue, index, array) {
  return previousValue + currentValue * array[array.length - index - 1];
});

Certes, c'est un exemple quelque peu artificiel, mais j'ai du mal à trouver un exemple qui ne semble pas artificiel. Dans tous les cas, les deux derniers paramètres sont parfois utiles.

1
Peter Olson 13 juil. 2015 à 05:26