Значения суммы из массива в JavaScript
Я определил переменные JavaScript под названием myData
, который является new Array
следующим образом:
var myData = new Array(['2013-01-22', 0], ['2013-01-29', 0], ['2013-02-05', 0],
['2013-02-12', 0], ['2013-02-19', 0], ['2013-02-26', 0],
['2013-03-05', 0], ['2013-03-12', 0], ['2013-03-19', 0],
['2013-03-26', 0], ['2013-04-02', 21], ['2013-04-09', 2]);
Мне интересно, можно ли суммировать числовые значения, найденные в массиве (например, 0 + 0 + 21 + 2 + 0 и т.д.) и, вероятно, переменная с результатом, который я могу использовать вне script, потому что у меня есть 7 таких массивов, соответствующих каждому из дней недели. Я хочу сделать сравнение после этого на основе этого. Это самый предпочтительный метод для такого рода действий, если это возможно?
Ответы
Ответ 1
Попробуйте выполнить
var myData = [['2013-01-22', 0], ['2013-01-29', 1], ['2013-02-05', 21]];
var myTotal = 0; // Variable to hold your total
for(var i = 0, len = myData.length; i < len; i++) {
myTotal += myData[i][1]; // Iterate over your first array and then grab the second element add the values up
}
document.write(myTotal); // 22 in this instance
Ответ 2
Вы можете использовать метод Array.reduce
:
var sum = myData.reduce(
function(sum, current){
return sum + current[1];
}, 0
);
См. MDN
Ответ 3
Я думаю, что самый простой способ:
values.reduce(function(a, b){return a+b;})
Ответ 4
Создание метода суммы будет работать хорошо, например. вы можете добавить функцию суммы в массив
Array.prototype.sum = function(selector) {
if (typeof selector !== 'function') {
selector = function(item) {
return item;
}
}
var sum = 0;
for (var i = 0; i < this.length; i++) {
sum += parseFloat(selector(this[i]));
}
return sum;
};
тогда вы могли бы сделать
> [1,2,3].sum()
6
и в вашем случае
> myData.sum(function(item) { return item[1]; });
23
Изменить: расширение встроенных функций может быть неодобрительно, потому что, если бы все это сделали, мы неожиданно неожиданно переопределили друг друга (конфликты пространства имен). вы можете добавить функцию суммы в некоторый модуль и принять массив в качестве аргумента, если хотите.
что может означать изменение сигнатуры на myModule.sum = function(arr, selector) {
, тогда this
станет arr
Ответ 5
Я бы использовал reduce
var myData = new Array(['2013-01-22', 0], ['2013-01-29', 0], ['2013-02-05', 0], ['2013-02-12', 0], ['2013-02-19', 0], ['2013-02-26', 0], ['2013-03-05', 0], ['2013-03-12', 0], ['2013-03-19', 0], ['2013-03-26', 0], ['2013-04-02', 21], ['2013-04-09', 2]);
var sum = myData.reduce(function(a, b) {
return a + b[1];
}, 0);
$("#result").text(sum);
Доступно на jsfiddle
Ответ 6
Или в ES6
values.reduce((a, b) => a + b),
Пример:
[1,2,3].reduce((a, b)=>a+b) // return 6
Ответ 7
Если вы хотите отбросить массив одновременно с суммированием, вы можете сделать (скажем, stack
- массив):
var stack = [1,2,3],
sum = 0;
while(stack.length > 0) { sum += stack.pop() };
Ответ 8
Вы можете использовать собственный метод карты для массивов.
map Метод (массив) (JavaScript)
var myData = new Array(['2013-01-22', 0], ['2013-01-29', 0], ['2013-02-05', 0],
['2013-02-12', 0], ['2013-02-19', 0], ['2013-02-26', 0],
['2013-03-05', 0], ['2013-03-12', 0], ['2013-03-19', 0],
['2013-03-26', 0], ['2013-04-02', 21], ['2013-04-09', 2]);
var a = 0;
myData.map( function(aa){ a += aa[1]; return a; });
a - ваш результат
Ответ 9
Встроенное сокращение для массивов javascript не является стандартным, но вы можете использовать underscore.js:
var data = _.range(10);
var sum = _(data).reduce(function(memo, i) {return memo + i});
который становится
var sumMyData = _(myData).reduce(function(memo, i) {return memo + i[1]}, 0);
для вашего дела. Посмотрите также на fiddle.
Ответ 10
Старый способ (если у вас нет длины аргументов/параметров)
>> function sumla1(){
result=0
for(let i=0; i<arguments.length;i++){
result+=arguments[i];
}
return result;
}
>> sumla1(45,67,88);
>> 200
ES6 (деструктурирование массива)
>> function sumla2(...x){return x.reduce((a,b)=>a+b)}
>>
>> sumla2(5,5,6,7,8)
>>
>> 31
>>
>> var numbers = [4, 9, 16, 25];
>> sumla2(...numbers);
>> 54