Каковы преимущества функции JavaScript () Javascript? (и карта ()) - PullRequest
4 голосов
/ 16 июня 2011

Я пытаюсь решить, использовать ли метод redu () в Javascript для функции, которую мне нужно написать, что-то вроде этого

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

Теперь это, очевидно, может быть записано как Reduce () функционируют следующим образом:

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

или что-то в этом роде.Есть ли какая-то производительность или другая разница между ними?Или какая-то другая причина (например, поддержка браузера), из-за которой одно должно быть предпочтительнее другого в среде веб-программирования?Спасибо.

Ответы [ 4 ]

4 голосов
/ 18 июля 2011

map и filter и reduce и forEach и ... (больше информации: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array#Iteration_methods) намного лучше, чем обычные циклы, потому что:

  1. Они более элегантны
  2. Они поощряют функциональное программирование (см. Преимущества функционального программирования)
  3. Вам нужно будет написать функции в любом случае и передать в них, как параметры, переменные итерации,Это потому, что у javascript нет области видимости блока.Такие функции, как map и reduce, значительно облегчают вашу работу, потому что они автоматически устанавливают вашу переменную итерации и передают ее в вашу функцию.

IE9 утверждает, что поддерживает их.Они в официальной спецификации javascript / ecmascript.Если вы заботитесь о людях, которые используют IE8, это ваша прерогатива.Если вас это действительно волнует, вы можете взломать его, переопределив Array.prototype ТОЛЬКО для IE8 и старше, чтобы «исправить» IE8 и старше.

4 голосов
/ 16 июня 2011

Несмотря на то, что я предпочитаю эти операции (уменьшить, отобразить, отфильтровать и т. Д.), По-прежнему их невозможно использовать из-за определенных браузеров, которые не поддерживают их в своих реализациях. Конечно, вы можете «залатать» его, расширив прототип Array, но это тоже открывает банку с червями.

Я не думаю, что с этими функциями что-то не так, и я думаю, что они улучшают код, но сейчас лучше их не использовать. Когда более высокий процент населения использует браузер, который поддерживает эти функции, я думаю, что это будет честной игрой.

Что касается производительности, они, вероятно, будут медленнее, чем рукописные циклы, из-за накладных расходов при вызовах функций.

2 голосов
/ 16 июня 2011

уменьшение используется для возврата одного значения из массива, в результате последовательной обработки результатов предыдущих элементов.

reduRight делает то же самое, но начинается в конце и работает в обратном направлении.

map используется для возврата массива, все члены которого были переданы через функцию.

ни один метод не влияет на сам массив.

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

// Это использование карты возвращает новый массив исходных элементов, преобразованный в числа-

A1 = A1.map (Number); // >> каждый из элементов A1 преобразован в число

// Это уменьшение сумм элементов массива-

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

// A1sum >> возвращаемое значение: (Число) 36

Они не поддерживаются в старых браузерах, поэтому вам нужно будет заменить их. Не стоит, если все, что вы делаете, можно скопировать в простой цикл.

Расчет стандартного отклонения популяции - это пример, где можно эффективно использовать как карту, так и уменьшение-

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))
0 голосов
/ 16 июня 2011

Кеннебек - хорошо, но ваша функция stDeviation вызывает уменьшает в два раза и отображает один раз, когда требуется только один вызов уменьшить (что делает его намного быстрее):

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 );
}

Следует выполнить преобразование в число при присвоении v [1] , чтобы убедиться, что номера строк не совпадают с результатом, а делитель в последней строке должен быть, вероятно, (n - 1) в в большинстве случаев, но это до ОП. : -)

...