--- title: Array.prototype.reduceRight() slug: Web/JavaScript/Reference/Global_Objects/Array/ReduceRight tags: - Array - ECMAScript 5 - JavaScript - Méthode - Prototype - Reference translation_of: Web/JavaScript/Reference/Global_Objects/Array/ReduceRight original_slug: Web/JavaScript/Reference/Objets_globaux/Array/reduceRight --- {{JSRef}} La méthode **`reduceRight()`** applique une fonction sur un accumulateur et chaque valeur d'un tableau (de la droite vers la gauche) de sorte à réduire le tableau en une seule valeur. {{EmbedInteractiveExample("pages/js/array-reduce-right.html")}} Voir également {{jsxref("Array.prototype.reduce()")}} pour une méthode qui réduit de gauche à droite. ## Syntaxe arr.reduceRight(callback[, valeurInitiale]) ### Paramètres - `callback` - : La fonction à éxécuter sur chaque valeur de la liste. Elle utilise quatres arguments : - `accumulator` - : La valeur précédemment retournée par le dernier appel de la fonction `callback`, ou `valeurInitial` si elle est fournie. (Voir ci-après.) - `valeurCourante` - : La valeur de l'élément courant dans le tableau. - `index` - : L'index de l'élément du tableau actuellement manipulé. - `array` - : Le tableau sur lequel `reduceRight()` est appelée. - `valeurInitiale` {{optional_inline}} - : C'est l'objet à utiliser comme accumulateur/premier argument lors du premier appel de la fonction `callback`. Si aucune valeur n'est fournie, c'est le dernier élément du tableau qui sera utilisé. Si on appelle `reduce()` ou `reduceRight()` sur un tableau vide sans fournir de valeur initiale, on aura une exception {{jsxref("TypeError")}}. ### Valeur de retour La valeur obtenue grâce à la fonction de réduction. ## Description `reduceRight` exécute la fonction `callback` une fois pour chaque élément présent dans le tableau, les éléments vides sont ignorés. La fonction `callback` utilise quatre arguments : la valeur initiale (ou la valeur retournée par le précédent appel de la fonction` callback`), la valeur de l'élément courant, l'index de l'élément courant, et le tableau qui est parcouru. L'usage de `reduceRight` avec définition d'un `callback` devrait ressembler à ceci : ```js array.reduceRight(function(accumulator, valeurCourante, index, array) {     // ... }); ``` La première fois que la fonction de callback est appelée, `accumulator` et `valeurCourante` peuvent correspondre à un ou deux éléments. Si `valeurInitiale` est fournie lors de l'appel à `reduceRight`, alors `accumulator` sera égale à `valeurInitiale` et `valeurCourante` sera égale à la dernière valeur de la liste. Si `valeurInitiale` n'est pas fournie, alors `accumulator` sera égale à la dernière valeur de la liste, et `valeurCourante` sera alors égale à l'avant-dernière valeur du tableau. Si on utilise la méthode `reduceRight` de la façon suivante : ```js [0, 1, 2, 3, 4].reduceRight(function(accumulator, valeurCourante, index, array) { return accumulator + valeurCourante; }); ``` La fonction `callback` sera appelée quatre fois, avec les arguments et les valeurs de retour de chaque appel suivant :
callback accumulator valeurCourante index array Valeur renvoyée
premier appel 4 3 3 [0,1,2,3,4] 7
second appel 7 2 2 [0,1,2,3,4] 9
troisième appel 9 1 1 [0,1,2,3,4] 10
quatrième appel 10 0 0 [0,1,2,3,4] 10
La valeur retournée par `reduceRight` sera alors celle du dernier appel de la fonction `callback` (`10`). Si vous fournissez une valeur initiale comme second argument à l'appel de `reduceRight`, le résultat sera alors le suivant : ```js [0, 1, 2, 3, 4].reduceRight(function(accumulator, valeurCourante, index, array) { return accumulator + valeurCourante; }, 10); ```
accumulator valeurCourante index array Valeur renvoyée
premier appel 10 4 4 [0,1,2,3,4] 14
second appel 14 3 3 [0,1,2,3,4] 17
troisième appel 17 2 2 [0,1,2,3,4] 19
quatrième appel 19 1 1 [0,1,2,3,4] 20
cinquième appel 20 0 0 [0,1,2,3,4] 20
La valeur renvoyée par `reduceRight` sera ici `20`. ## Exemples ### Additionner toutes les valeurs d'une liste ```js var total = [0, 1, 2, 3].reduceRight(function(a, b) { return a + b; }); // total == 6 ``` ### Aplatir une liste de listes ```js var aplati = [[0, 1], [2, 3], [4, 5]].reduceRight(function(a, b) { return a.concat(b); }, []); // aplati [4, 5, 2, 3, 0, 1] ``` ### Différence entre `reduce` et `reduceRight` ```js var a = ['1', '2', '3', '4','5'] var gauche = a.reduce(function(prev, cur) { return prev + cur; }); var droite = a.reduceRight(function(prev, cur) { return prev + cur; }); console.log(gauche); // "12345" console.log(droite); // "54321" ``` ### Composition de fonctions à l'aide de `reduce` La composition de fonctions consiste en l'enchaînement de n fonctions l'une après l'autre (où les appels sont généralement exécutés de droite à gauche. ```js /** * * h(x) = f(g(x)) * * https://fr.wikipedia.org/wiki/Composition_de_fonctions */ const compose = (...args) => (value) => args.reduceRight((acc, fn) => fn(acc), value) // On incrémente un nombre passé en argument const inc = (n) => n + 1 // On double la valeur passée en argument const double = (n) => n * 2 // On compose double(inc(x)) compose(double, inc)(2) // 6 // On compose inc(double(x)) compose(inc, double)(2) // 5 ``` ## Spécifications | Spécification | État | Commentaires | | ------------------------------------------------------------------------------------------------------------------------ | ---------------------------- | ----------------------------------------------------- | | {{SpecName('ES5.1', '#sec-15.4.4.22', 'Array.prototype.reduceRight')}} | {{Spec2('ES5.1')}} | Définition initiale. Implémentée avec JavaScript 1.8. | | {{SpecName('ES6', '#sec-array.prototype.reduceright', 'Array.prototype.reduceRight')}} | {{Spec2('ES6')}} | | | {{SpecName('ESDraft', '#sec-array.prototype.reduceright', 'Array.prototype.reduceRight')}} | {{Spec2('ESDraft')}} | | ## Compatibilité des navigateurs {{Compat("javascript.builtins.Array.reduceRight")}} ## Voir aussi - {{jsxref("Array.prototype.reduce()")}}