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

Autre que de dire "transformer est une alternative plus puissante pour réduire", je ne trouve pas de documentation de l'quelles sont les différences. Quelles sont les différences entre transformer et réduire dans lodash (autre que celui étant 25% plus lent)?

43
demandé sur megawac 2014-02-04 00:03:37

2 réponses

j'aime plonger dans le code source avant d'utiliser les utilitaires. Pour lo-dash, cela peut être difficile car il y a une tonne de fonctionnalités internes abstraites dans tous les utilitaires.

Donc les différences évidentes sont:

  • Si vous ne spécifiez accumulateur (communément appelé mémo si vous êtes utilisé pour souligner), _.transform devinera si vous voulez un tableau ou un objet tout en réduisant fera de l'accumulateur l'élément initial de la collection.

exemple, tableau ou objet map via transform:

_.transform([1, 2, 3], function(memo, val, idx) {
    memo[idx] = val + 5;
});
// => [6, 7, 8]

Versus reduce (notez que vous devez connaître le type d'entrée!)

_.reduce([1, 2, 3], function(memo, val, idx) {
    memo[idx] = val + 5;
    return memo;
}, []);

alors avec reduce le ci-dessous calcule la somme d'un tableau, ce ne serait pas possible avec transform as 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 l'accumulateur ne peut pas changer la valeur (c'est à dire qu'il 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 à l'aide de réduire.

par exemple si vous vouliez convertir un tableau en Dictionnaire de valeurs avec reduce vous écririez le code comme suit::

_.reduce([1, 2, 3, 4, 5], function(memo, idx) {
   memo[idx] = true;
   return memo;
}, {});

alors qu'avec transform nous pouvons écrire ceci très bien sans avoir besoin de retourner l'accumulateur comme dans reduce

_.transform([1, 2, 3, 4, 5], function(memo, idx) {
   memo[idx] = true;
}, {});
  • une autre distinction est que nous pouvons sortir de l'itération de transformation en retournant false.

dans l'ensemble, je dirais que reduce est une méthode plus flexible, car vous avez plus de contrôle sur l'accumulateur, mais transform peut être utilisé pour écrire du code équivalent pour certains cas dans un style plus simple.

74
répondu megawac 2014-08-27 13:51:27

transformer fonctionne sur des objets, réduire ne fonctionne pas

-3
répondu GN. 2017-12-22 01:43:31