4 votes

Utiliser underscore js réduire

Comment underscorejs reduce travail ?

Il est simple d'obtenir _.reduce([1, 2, 3], function(memo, num){ return memo + num; }, 0); (le résultat est 6 ).

Mais comment fonctionnent les autres paramètres facultatifs ? Dans la documentation, il est dit :

Memo est l'état initial de la réduction, et chaque étape successive de celle-ci doit être retournée par l'itérateur. On passe quatre arguments à l'itérateur : le mémo, puis la valeur et l'index (ou clé) de l'itération, et enfin une référence à la liste entière."

Mais je ne comprends pas. J'ai essayé d'utiliser reduce pour le problème suivant, et je n'ai pas réussi à le résoudre :

var input = [{"score": 2, "name": "Jon", "venue": "A"}, {"score": 3, "name": "Jeff", "venue":"A"}, {"score": 4, "name": "Jon", "venue":"B"}, {"score": 4, "name": "Jeff", "venue":"B"}];

var output = [{"score": 6, "name":"Jon", "venue": ["A", "B"]}, {"score": 7, "name":"Jeff", "venue": ["A", "B"]}];

Comment puis-je obtenir la sortie en utilisant _reduce pour la saisie ? Et il sera vraiment utile de savoir comment cela fonctionne à l'intérieur de réduire.

10voto

Alberto Points 637

Reduce prend une liste de valeurs, et la réduit à une seule valeur. Ce que vous essayez de faire n'est pas une simple réduction. Vous essayez d'abord de regrouper (par nom) et ensuite de réduire chaque groupe. Une implémentation possible serait quelque chose comme ceci, où vous regroupez d'abord, et ensuite mappez chaque groupe à une opération de réduction qui accumule le score et ajoute le lieu.

var input = [
    {"score": 2, "name": "Jon", "venue": "A"}, 
    {"score": 3, "name": "Jeff", "venue":"A"}, 
    {"score": 4, "name": "Jon", "venue":"B"}, 
    {"score": 4, "name": "Jeff", "venue":"B"}];

var output = _.map(_.groupBy(input, "name"), function(group, name) {
    return _.reduce(group, function(memo, elem) { 
            memo.score += elem.score;
            memo.venue.push(elem.venue);
            return memo;
        },
        { name: name, score: 0, venue: [] });
});

2voto

Serabe Points 2618

Au lieu de reduce essayez d'utiliser la méthode simple et claire each de cette façon :

_.each admet un troisième paramètre pour un contexte. Ainsi, par exemple :

var input = ["Alice", "Bob", "Charlie"];
var context = {};

_.each(input, function(o,i) { this[i] = o; }, context);

console.log(context) //=> {1: "Alice", 2: "Bob", 3: "Charlie"}

Ruby a une nouvelle méthode appelée each_with_object similaire à reduce pour ce motif exact, où le mémo n'est pas nécessairement la valeur retournée (en fait, ma fonction ne retourne rien !); mais underscore simplifie la conception de son API en admettant simplement un contexte pour la fonction comme troisième paramètre.

Vous pouvez utiliser reduce, mais vous devrez renvoyer le mémo à chaque fois, ce qui est un peu moins élégant à mon avis.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X