Ответ 1
Вы можете использовать reduce
.
var sum = array.reduce(function(pv, cv) { return pv + cv; }, 0);
И с функциями стрелок, представленными в ES6, это еще проще:
sum = array.reduce((pv, cv) => pv+cv, 0);
Каков самый быстрый способ подвести массив в JavaScript? Быстрый поиск переворачивает несколько разных методов, но я хотел бы, если возможно, использовать собственное решение. Это будет работать под SpiderMonkey.
Мысль о самом ящике, который я использовал:
var count = 0;
for(var i = 0; i < array.length; i++)
{
count = count + array[i];
}
Я уверен, что есть лучший путь, а затем прямая итерация.
Вы можете использовать reduce
.
var sum = array.reduce(function(pv, cv) { return pv + cv; }, 0);
И с функциями стрелок, представленными в ES6, это еще проще:
sum = array.reduce((pv, cv) => pv+cv, 0);
var count = 0;
for(var i=0, n=array.length; i < n; i++)
{
count += array[i];
}
Это извлекает array.length
один раз, а не каждую итерацию. Оптимизация выполняется путем кэширования значения.
var count=0;
for (var i=array.length; i--;) {
count+=array[i];
}
Это эквивалентно обратному циклу while. Он кэширует значение и сравнивается с 0, тем самым ускоряя итерацию.
Более полный список сравнения см. в разделе JSFiddle.
Примечание: array.reduce там ужасен, но в Firebug Console он быстрее всего.
Я начал использовать JSPerf для суммирования массива. Он был быстро построен и не гарантированно был полным или точным, но что редактирование для:)
При поиске наилучшего метода суммирования массива я написал тест производительности.
В Chrome "сокращение" кажется значительно превосходенным
Я надеюсь, что это поможет
// Performance test, sum of an array
var array = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
var result = 0;
// Eval
console.time("eval");
for(var i = 0; i < 10000; i++) eval("result = (" + array.join("+") + ")");
console.timeEnd("eval");
// Loop
console.time("loop");
for(var i = 0; i < 10000; i++){
result = 0;
for(var j = 0; j < array.length; j++){
result += parseInt(array[j]);
}
}
console.timeEnd("loop");
// Reduce
console.time("reduce");
for(var i = 0; i < 10000; i++) result = array.reduce(function(pv, cv) { return pv + parseInt(cv); }, 0);
console.timeEnd("reduce");
// While
console.time("while");
for(var i = 0; i < 10000; i++){
j = array.length;
result = 0;
while(j--) result += array[i];
}
console.timeEnd("while");
eval: 5233.000мс
loop: 255.000ms
уменьшить: 70.000 мс
в то время как: 214.000мс
Самый быстрый цикл, согласно этот тест - это цикл while в обратном
var i = arr.length; while (i--) { }
Итак, этот код может быть самым быстрым, что вы можете получить
Array.prototype.sum = function () {
var total = 0;
var i = this.length;
while (i--) {
total += this[i];
}
return total;
}
Array.prototype.sum
добавляет метод суммы в класс массива... вы можете легко сделать его вспомогательной функцией.
В вашем конкретном случае просто используйте метод reduce
массивов:
var sumArray = function() {
// Use one adding function rather than create a new one each
// time sumArray is called
function add(a, b) {
return a + b;
}
return function(arr) {
return arr.reduce(add);
};
}();
alert( sumArray([2, 3, 4]) );
Или вы могли бы сделать это злобным путем.
var a = [1,2,3,4,5,6,7,8,9];
sum = eval(a.join("+"));
;)
На основе этот тест (for-vs-forEach-vs-reduce) и этот (цикл)
Я могу сказать, что:
var total = 0;
for (var i = 0, n = array.length; i < n; ++i)
{
total += array[i];
}
Для вас это вам не понадобится, но это добавляет много гибкости.
Array.prototype.Aggregate = function(fn) {
var current
, length = this.length;
if (length == 0) throw "Reduce of empty array with no initial value";
current = this[0];
for (var i = 1; i < length; ++i)
{
current = fn(current, this[i]);
}
return current;
};
Использование:
var total = array.Aggregate(function(a,b){ return a + b });
Затем наступает forEach
и reduce
, которые имеют почти такую же производительность и варьируются от браузера к браузеру, но в любом случае они имеют наихудшую производительность.
один из самых простых, быстрых, многоразовых и гибких:
Array.prototype.sum = function () {
for(var total = 0,l=this.length;l--;total+=this[l]); return total;
}
// usage
var array = [1,2,3,4,5,6,7,8,9,10];
array.sum()