À part dire que "transformer est une alternative plus puissante à réduire", je ne trouve aucune documentation sur les différences. Quelles sont les différences entre transformer et réduire en lodash (à part qu'il soit 25% plus lent )?
J'aime plonger dans le code source avant de lancer les utilitaires. Pour lo-dash, cela peut être difficile car il y a une tonne de fonctionnalités internes abstraites dans tous les utilitaires.
Les différences évidentes sont donc:
_.transform
devinera si vous voulez un tableau ou un objet tandis que réduire fera de l'accumulateur l'élément initial de la collection.Exemple, tableau ou carte d'objets via transform
:
_.transform([1, 2, 3], function(memo, val, idx) {
memo[idx] = val + 5;
});
// => [6, 7, 8]
Versus réduire (notez, vous devez connaître le type d'entrée!)
_.reduce([1, 2, 3], function(memo, val, idx) {
memo[idx] = val + 5;
return memo;
}, []);
Ainsi, alors qu'avec réduire la valeur ci-dessous calculera la somme d'un tableau, cela ne serait pas possible avec transform car a
sera un tableau.
var sum = _.reduce([1, 2, 3, 4], function(a, b) {
return a + b;
});
transform
et que l'accumulateur ne peut pas changer de valeur (c'est-à-dire que ce sera toujours le même tableau). Je dirais que c'est le plus grand avantage de la fonction, car j'ai souvent oublié de retourner l'accumulateur en utilisant réduire.Par exemple, si vous vouliez convertir un tableau en dictionnaire de valeurs avec réduire, vous écririez du code comme suit:
_.reduce([1, 2, 3, 4, 5], function(memo, idx) {
memo[idx] = true;
return memo;
}, {});
Alors qu'avec transform, nous pouvons écrire cela très bien sans avoir besoin de retourner l'accumulateur comme dans réduire
_.transform([1, 2, 3, 4, 5], function(memo, idx) {
memo[idx] = true;
}, {});
Dans l'ensemble, je dirais que réduire est une méthode plus flexible, car vous avez plus de contrôle sur l'accumulateur, mais transformer peut être utilisé pour écrire du code équivalent pour certains cas dans un style plus simple.