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.
var aplati = [[0, 1], [2, 3]].reduceRight(function(a, b) { return a.concat(b); }, []); // aplati vaut [2, 3, 0, 1]
Voir également 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 :
valeurPrécédente
- La valeur précédemment retournée par le dernier appel de la fonction
callback
, ouvaleurInitial
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
- Ce paramètre est optionnel. C'est l'objet à utiliser comme premier argument lors du premier appel de la fonction
callback
.
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 :
array.reduceRight(function(valeurPrécédente, valeurCourante, index, array) { // ... });
La première fois que la fonction de callback est appelée, valeurPrécédente
et valeurCourante
peuvent correspondre à un ou deux éléments. Si valeurInitiale
est fournie lors de l'appel à reduceRight
, alors valeurPrécédente
sera égale à valeurInitiale
et valeurCourante
sera égale à la dernière valeur de la liste. Si valeurInitiale
n'est pas fournie, alors valeurPrécédente
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 :
[0, 1, 2, 3, 4].reduceRight(function(valeurPrécédente, valeurCourante, index, array) { return valeurPrécédente + valeurCourante; });
La fonction callback
sera appelée quatre fois, avec les arguments et les valeurs de retour de chaque appel suivant :
valeurPrécédente |
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 :
[0, 1, 2, 3, 4].reduceRight(function(valeurPrécédente, valeurCourante, index, array) { return valeurPrécédente + valeurCourante; }, 10);
valeurPrécédente |
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
var total = [0, 1, 2, 3].reduceRight(function(a, b) { return a + b; }); // total == 6
Aplatir une liste de listes
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
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"
Prothèse d'émulation (polyfill)
Array.prototype.reduceRight
a été ajoutée avec la 5ème édition du standard ECMA-262 (ECMAScript 5). Pour cette raison, il se peut qu'elle ne soit pas présente dans toutes les implémentations du standard. Pour contourner ce problème, vous pouvez ajouter le code suivant au début de vos scripts. Il vous permettra d'utiliser reduceRight
au sein d'environnements qui ne supportent pas cette méthode nativement. Cet algorithme est celui exactement spécifié pour ECMAScript 5 si on a bien Object
et TypeError
qui ont leur valeur d'origine et que callbackfn.call
correspond bien à la valeur initiale de Function.prototype.call
.
// Production steps of ECMA-262, Edition 5, 15.4.4.22 // Reference: https://es5.github.io/#x15.4.4.22 if ('function' !== typeof Array.prototype.reduceRight) { Array.prototype.reduceRight = function(callback /*, initialValue*/) { 'use strict'; if (null === this || 'undefined' === typeof this) { throw new TypeError('Array.prototype.reduce called on null or undefined' ); } if ('function' !== typeof callback) { throw new TypeError(callback + ' is not a function'); } var t = Object(this), len = t.length >>> 0, k = len - 1, value; if (arguments.length >= 2) { value = arguments[1]; } else { while (k >= 0 && !(k in t)) { k--; } if (k < 0) { throw new TypeError('Reduce of empty array with no initial value'); } value = t[k--]; } for (; k >= 0; k--) { if (k in t) { value = callback(value, t[k], k, t); } } return value; }; }
Spécifications
Spécification | État | Commentaires |
---|---|---|
ECMAScript 5.1 (ECMA-262) La définition de 'Array.prototype.reduceRight' dans cette spécification. |
Standard | Définition initiale. Implémentée avec JavaScript 1.8. |
ECMAScript 2015 (6th Edition, ECMA-262) La définition de 'Array.prototype.reduceRight' dans cette spécification. |
Standard | |
ECMAScript 2017 Draft (ECMA-262) La définition de 'Array.prototype.reduceRight' dans cette spécification. |
Projet |
Compatibilité des navigateurs
Fonctionnalité | Chrome | Firefox (Gecko) | Internet Explorer | Opera | Safari |
---|---|---|---|---|---|
Support simple | (Oui) | 3.0 (1.9) | 9 | 10.5 | 4.0 |
Fonctionnalité | Android | Chrome pour Android | Firefox Mobile (Gecko) | IE Mobile | Opera Mobile | Safari Mobile |
---|---|---|---|---|---|---|
Support simple | (Oui) | (Oui) | (Oui) | (Oui) | (Oui) | (Oui) |