2 minutes
Réduire un tableau en JavaScript
Réduire un tableau en JavaScript peut être effectué en utilisant la méthode reduce(). Cette méthode applique une fonction contre un accumulateur qui prend chaque valeur du tableau (de gauche à droite) pour le réduire à une seule valeure.
Signature de la méthode reduce()
La méthode reduce() prend 2 paramètres:
- (Obligatoire) Une fonction callback de réduction. Elle sera appliquée à chaque paire: valeur précédente (résultat de la dernière exécution) et valeur suivante.
- (Facultatif) Une valeur initiale qui sera utilisée comme paramètre du premier appel à la fonction de callback
Exemple: accumulation, concaténation
Calcul du prix d’un panier:
// Elements du panier
var items = [{price: 50}, {price: 100}, {price: 500}];
// Fonction de réduction (callback function)
var reducer = function add(sumSoFar, item) { return sumSoFar + item.price; };
//
var totalPrice = items.reduce(reducer, 0);
console.log(totalPrice);
// 650
Usage avancé (combinaison)
Inspiré de redux combineReducers.
Combiner plusieurs reducers en une seule fonction de réduction:
var reducers = {
totalInDollar: function(state, item) {
// specific statements...
return state.dollars += item.price;
},
totalInEuros : function(state, item) {
return state.euros += item.price * 0.897424392;
},
totalInPounds : function(state, item) {
return state.pounds += item.price * 0.692688671;
},
totalInYen : function(state, item) {
return state.yens += item.price * 113.852;
}
// more...
};
On crée une fonction qui retourne une fonction callback de réduction qui va appliquer chaque fonction de réduction individuellement.
var combineTotalPriceReducers = function(reducers) {
return function(state, item) {
return Object.keys(reducers).reduce(
function(nextState, key) {
reducers[key](state, item);
return state;
},
{}
);
}
};
Voici le code pour l’utiliser:
var bigTotalPriceReducer = combineTotalPriceReducers(reducers);
var initialState = {dollars: 0, euros:0, yens: 0, pounds: 0};
var totals = items.reduce(bigTotalPriceReducer, initialState);
console.log(totals);
/*
Object {dollars: 1130, euros: 1015.11531904, yens: 127524.24, pounds: 785.81131152}
*/