web-dev-qa-db-fra.com

Quelle est la différence entre transformer et réduire en lodash

À 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 )?

48
Kris Erickson

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:

  • Si vous ne spécifiez pas l'accumulateur (communément appelé mémo si vous sont utilisés pour souligner), _.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;
});
  • Une autre grande différence est que vous n'avez pas à retourner l'accumulateur avec 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;
}, {});
  • Une autre distinction est que nous pouvons quitter l'itération de transformation en renvoyant false.

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.

82
megawac