Référence de JavaScript 1.5 Core:Objets globaux:Array:reduce
Un article de MDC.
Sommaire |
[modifier] Résumé
Applique une fonction simultanément sur deux valeurs du tableau (de gauche à droite) afin de le réduire à une seule valeur.
| Méthode de Array | |
| Implémentation : | JavaScript 1.8 (Gecko 1.9a5 et ultérieurs) |
| Édition d'ECMAScript : | aucune |
[modifier] Syntaxe
var resultat = array.reduce(callback[, valeurInitiale]);
[modifier] Paramètres
-
callback - Fonction à exécuter sur chaque valeur du tableau.
-
valeurInitiale - Objet à utiliser comme premier paramètre lors du premier appel de la fonction
callback.
[modifier] Description
La méthode reduce exécute la fonction callback une seule fois pour chaque élément présent dans le tableau, à l'exception des trous dans le tableau, et prend quatre paramètres : la valeur initiale (ou valeur de l'appel précédent à callback), la valeur de l'élément courant, l'indice courant et l'objet Array parcouru.
L'appel à la fonction de réduction callback ressemblerait à quelque chose comme ceci :
.reduce(function(valeurPrécédente, valeurCourante, indice, array){
// ...
})
La première fois que la fonction est appelée, les valeurs valeurPrécédente et valeurCourante peuvent être dans deux états différents. Si une valeurInitiale a été fournie dans l'appel à reduce, alors valeurPrécédente sera égale à valeurInitiale et valeurCourante à celle du premier élément du tableau. Si aucune valeurInitiale n'a été fournie, valeurPrécédente sera égale à la première valeur du tableau et valeurCourante à celle du second élément.
Voici à quoi ressembleraient quelques exemples de déroulement de la fonction :
[0,1,2,3,4].reduce(function(valeurPrécédente, valeurCourante, indice, array){
return valeurPrécédente + valeurCourante;
});
// Premier appel
valeurPrécédente = 0, valeurCourante = 1, indice = 1
// Second appel
valeurPrécédente = 1, valeurCourante = 2, indice = 2
// Troisième appel
valeurPrécédente = 3, valeurCourante = 3, indice = 3
// Quatrième appel
valeurPrécédente = 6, valeurCourante = 4, indice = 4
// array est toujours l'objet [0,1,2,3,4] sur lequel reduce a été appelée
// Valeur de retour : 10
Et si vous aviez fourni une valeurInitiale, le résultat aurait ressemblé à ceci :
[0,1,2,3,4].reduce(function(valeurPrécédente, valeurCourante, indice, array){
return valeurPrécédente + valeurCourante;
}, 10);
// Premier appel
valeurPrécédente = 10, valeurCourante = 0, indice = 0
// Second appel
valeurPrécédente = 10, valeurCourante = 1, indice = 1
// Troisième appel
valeurPrécédente = 11, valeurCourante = 2, indice = 2
// Quatrième appel
valeurPrécédente = 13, valeurCourante = 3, indice = 3
// Cinquième appel
valeurPrécédente = 16, valeurCourante = 4, indice = 4
// array est toujours l'objet [0,1,2,3,4] sur lequel reduce a été appelée
// Valeur de retour : 20
[modifier] Compatibilité
La méthode reduce est une extension de JavaScript à la norme ECMA-262 ; en tant que telle elle peut ne pas être présente dans d'autres implémentations de cette norme. Il est possible de contourner ceci en insérant le code qui suit au début de vos scripts, permettant d'utiliser reduce dans des implémentations d'ECMA-262 qui ne la gèrent pas nativement. Cet algorithme est le même que celui utilisé dans Firefox et SpiderMonkey.
if (!Array.prototype.reduce)
{
Array.prototype.reduce = function(fun /*, initial*/)
{
var len = this.length;
if (typeof fun != "function")
throw new TypeError();
// no value to return if no initial value and an empty array
if (len == 0 && arguments.length == 1)
throw new TypeError();
var i = 0;
if (arguments.length >= 2)
{
var rv = arguments[1];
}
else
{
do
{
if (i in this)
{
rv = this[i++];
break;
}
// if array contains no values, no initial value to return
if (++i >= len)
throw new TypeError();
}
while (true);
}
for (; i < len; i++)
{
if (i in this)
rv = fun.call(null, rv, this[i], i, this);
}
return rv;
};
}
[modifier] Exemples
[modifier] Exemple : somme toutes les valeurs d'un tableau
var total = [0, 1, 2, 3].reduce(function(a, b){ return a + b; });
// total == 6
[modifier] Exemple : mise à plat d'un tableau de tableaux
var aplat = [[0,1], [2,3], [4,5]].reduce(function(a,b) {
return a.concat(b);
}, []);
// aplat vaut [0, 1, 2, 3, 4, 5]