Wat is het verschil tussen transformeren en verkleinen in lodash

Behalve dat “transformeren een krachtiger alternatief is om te verminderen”, kan ik geen documentatie vinden over wat de verschillen zijn. Wat zijn de verschillen tussen transformeren en verkleinen in lodash (behalve dat het 25% langzameris)?


Antwoord 1, autoriteit 100%

Ik duik graag in de broncode voordat ik hulpprogramma’s erbij haal. Voor lo-dash kan dit moeilijk zijn, omdat er een heleboel geabstraheerde interne functionaliteit is in alle hulpprogramma’s.

Dus de voor de hand liggende verschillen zijn:

  • Als u de accumulatorniet opgeeft (gewoonlijk memogenoemd
    als je gewend bent om te onderstrepen), zal _.transformraden als je wilt
    een array of object, terwijl reduce de accumulator het eerste item van de verzameling maakt.

Voorbeeld, array of objectmap via transform:

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

Versus verminderen (let op, u moet het invoertype kennen!)

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

Dus terwijl met verkleinen het onderstaande de som van een array berekent, zou dit niet mogelijk zijn met transform omdat aeen array zal zijn.

var sum = _.reduce([1, 2, 3, 4], function(a, b) {
    return a + b;
});
  • Een ander groot verschil is dat je de accumulator niet hoeft terug te sturen met transformen dat de accumulator de waarde niet kan veranderen (het zal dus altijd dezelfde array zijn). Ik zou zeggen dat dit het grootste voordeel van de functie is, omdat ik vaak ben vergeten de accu terug te sturen met reduce.

Als u bijvoorbeeld een array wilt converteren naar een woordenboek met waarden met reduce, zou u de volgende code schrijven:

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

Terwijl we met transformatie dit heel mooi kunnen schrijven zonder de accumulator terug te hoeven sturen, zoals in reduce

_.transform([1, 2, 3, 4, 5], function(memo, idx) {
   memo[idx] = true;
}, {});
  • Een ander onderscheid is dat we de transformatie-iteratie kunnen verlaten door false te retourneren.

Over het algemeen zou ik zeggen dat reduce een flexibelere methode is, omdat je meer controle hebt over de accumulator, maar transformatie kan worden gebruikt om in sommige gevallen equivalente code te schrijven in een eenvoudiger stijl.


Antwoord 2

transformeren werkt op objecten, verkleinen niet

Other episodes