1
votes

«Array.prototype.reduceRight» est-il identique à «reverse» suivi de «reduction»?

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?


2 commentaires

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


3 Réponses :


3
votes

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.


0 commentaires

1
votes

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


0 commentaires

3
votes

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.

    < / li>
  • 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.


1 commentaires

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.