Question

J'essaye de décider d'utiliser la méthode reduction () en Javascript pour une fonction que j'ai besoin d'écrire et qui est quelque chose comme ça

var x = [some array], y = {};
for (...) {
    someOperation(x[i]);
    y[x[i]] = "some other value";
}

Maintenant, cela peut évidemment être écrit comme une fonction reduction () de la manière suivante:

x.reduce(function(prev, current, index, arr) {
    someOperation(current);
    prev[current] = "some other value";
    return prev;
}, {})

Ou quelque chose comme ça.Y a-t-il une performance ou une autre différence entre les deux?Ou une autre raison (comme la prise en charge du navigateur, par exemple) en raison de laquelle l'un devrait être favorisé par rapport à l'autre dans un environnement de programmation Web?Merci.

Était-ce utile?

La solution

Même si je préfère ces opérations (réduire, mapper, filtrer, etc.), il n'est toujours pas possible de les utiliser à cause de certains navigateurs qui ne les prennent pas en charge dans leurs implémentations.Bien sûr, vous pouvez le «patcher» en étendant le prototype Array, mais cela ouvre aussi une boîte de vers.

Je ne pense pas qu'il y ait quelque chose qui cloche en soi avec ces fonctions, et je pense qu'elles font un meilleur code, mais pour l'instant, il vaut mieux ne pas les utiliser.Une fois qu'un pourcentage plus élevé de la population utilise un navigateur qui prend en charge ces fonctions, je pense que ce sera un jeu équitable.

En ce qui concerne les performances, celles-ci seront probablement plus lentes que les boucles for écrites à la main en raison de la surcharge des appels de fonction.

Autres conseils

map et filter et reduce et forEach et ... (plus d'informations: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array#Iteration_methods ) sont bien meilleurs que les boucles normales car:

  1. Ils sont plus élégants
  2. Ils encouragent la programmation fonctionnelle (voir les avantages de la programmation fonctionnelle)
  3. Vous devrez écrire des fonctions de toute façon et y passer, comme paramètres, des variables d'itération. C'est parce que javascript n'a pas de portée de bloc. Des fonctions telles que map et reduce facilitent grandement votre travail car elles configurent automatiquement votre variable d'itération et la transmettent à votre fonction pour vous.

IE9 prétend les prendre en charge. Ils sont dans la spécification officielle javascript / ecmascript. Si vous vous souciez des personnes qui utilisent IE8, c'est votre prérogative. Si vous vous en souciez vraiment, vous pouvez le pirater en remplaçant Array.prototype pour UNIQUEMENT IE8 et plus ancien, pour "réparer" IE8 et plus ancien.

réduire est utilisé pour renvoyer une valeur à partir d'un tableau, suite au traitement séquentiel des résultats des éléments précédents.

reductionRight fait la même chose, mais commence à la fin et fonctionne à l'envers.

map est utilisée pour renvoyer un tableau dont les membres ont tous été passés par une fonction.

aucune de ces méthodes n'affecte le tableau lui-même.

var A1= ['1', '2', '3', '4', '5', '6', '7', '8'];

// Cette utilisation de la carte renvoie un nouveau tableau des éléments d'origine, convertis en nombres-

A1= A1.map (Number); // >> chacun des éléments de A1 est converti en nombre

// Cette réduction fait le total des éléments du tableau-

var A1sum= A1.reduce (function (a, b) {return a + b;});

// A1sum >> valeur renvoyée: (Number) 36

Ils ne sont pas pris en charge dans les navigateurs plus anciens, vous devrez donc leur fournir un substitut. Cela ne vaut pas la peine si tout ce que vous faites peut être répliqué en une simple boucle.

La détermination de l'écart type d'une population est un exemple où la carte et la réduction peuvent être utilisées efficacement-

Math.mean= function(array){
    return array.reduce(function(a, b){ return a+b; })/array.length;
}
Math.stDeviation=function(array){
    var mean= Math.mean(array);
    dev= array.map(function(itm){return (itm-mean)*(itm-mean); });
    return Math.sqrt(dev.reduce(function(a, b){ return a+b; })/array.length);
}


var A2= [6.2, 5, 4.5, 6, 6, 6.9, 6.4, 7.5];
alert ('mean: '+Math.mean(A2)+'; deviation: '+Math.stDeviation(A2))

kennebec - bien joué, mais votre fonction stDeviation appelle reduction deux fois et map une fois quand elle ne nécessite qu'un seul appel à réduire (ce qui le rend beaucoup plus rapide):

Math.stDev = function (a) {
    var n = a.length;
    var v = a.reduce(function (v, x) {
      v[0] += x * x;
      v[1] += x;
      return v;
    }, [0,0]);
    return Math.sqrt( (v[0] - v[1]*v[1] / n) / n );
}

Devrait effectuer une conversion en nombre lors de l'affectation à v [1] pour s'assurer que les nombres de chaînes ne gâchent pas le résultat et que le diviseur de la dernière ligne devrait probablement être (n - 1)dans la plupart des cas, mais cela dépend du PO.:-)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top