Array.prototype. reductionRight
réduit un tableau à une valeur unique, en travaillant de droite à gauche (c'est-à-dire en commençant par la fin du tableau).
Appelle reductionRight
exactement de la même manière que l'appel de reverse
suivi de réduire
? Si tel est le cas, pourquoi reductionRight
existe-t-il?
3 Réponses :
Array # reductionRight
n'est pas identique à Array # reverse ()
-> Array # reduction ()
. Voici la principale différence .reduce ()
/ .reduceRight ()
ne modifiez pas le tableau de départ:
const arr = ["a", "b", "c"]; const combine = arr.reverse().reduce((a, b) => a+b, ""); console.log(combine); console.log(arr);
Cependant, .reverse ()
fait:
const arr = ["a", "b", "c"]; const combine = arr.reduceRight((a, b) => a+b, ""); console.log(combine); console.log(arr);
Il y a aussi une question pour une performance - .reverse
entraînera un traitement supplémentaire O (n)
pour inverser le tableau en place, c'est sur en haut du .reduce ()
qui fonctionne déjà à O (n)
. Oui, la complexité finale est toujours O (n)
(nous ignorons les constantes) mais avoir un seul passage dans le tableau est plus rapide.
Il a déjà été mentionné que .reverse ()
modifie le tableau initial,
De plus, selon les spécifications:
https://tc39.es/ecma262/#sec-array.prototype .reduce
https://tc39.es/ecma262/#sec-array.prototype .reduceright
Les implémentations sont un peu différentes.
Permettez-moi de faire l'analogie avec .push ()
et .unshift ()
- ils font aussi tout à fait la même chose, en insérant un élément dans un tableau, nous utilisons push a beaucoup, et unshift assez rarement, mais de temps en temps, il y a des moments parfaits pour unshift
ainsi que pour reduceright
Comme déjà mentionné, ce n'est pas la même chose. Voici deux autres cas d'utilisation, où ces deux versions se comportent différemment:
Tout ce qui est basé sur l'index (troisième argument de la fonction de rappel appelé à la fois par reduction
et reductionRight
) peut se comporter différemment.
Les boucles inversées sont souvent utilisées lorsque le tableau original est en cours de modification. Selon le cas d'utilisation exact, cela peut fonctionner avec reductionRight
mais rompre avec reduce
.
Je ne pensais pas que les index étaient différents entre les deux, mais vous avez tout à fait raison. C'est en soi une différence suffisante pour que reductionRight ()
et reverse (). Reduction ()
soient complètement incompatibles même si reverse
produit un nouveau tableau sans modifier l'original.
Ce n'est pas la même chose, reverse inverse le tableau en place , alors que reductionRight ne mute pas l'original.
L'inverse est une méthode sur place, alors que la réduction n'est pas