it-roy-ru.com

Суммирование значений из массива в 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 таких массивов, соответствующих каждому дню недели. Я хочу сделать сравнение впоследствии на основе этого. Что является наиболее предпочтительным методом для такого рода действий, если это возможно? 

49
Daniela costina Vaduva

Попробуйте следующее

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

18
Mark Walters

Вы можете использовать метод Array.reduce:

const myData = [
  ['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]
];
const sum = myData
  .map( v => v[1] )                                
  .reduce( (sum, current) => sum + current, 0 );
  
console.log(sum);

Смотрите MDN

93
KooiInc

Я думаю, что самый простой способ может быть:

values.reduce(function(a, b){return a+b;})
53
ruhanbidart

Я бы использовал уменьшить

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

13
Xotic750

Создание метода суммы будет работать хорошо, например, Вы можете добавить функцию суммы в массив

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

Правка: Расширение встроенных функций может вызывать недовольство, потому что, если бы все это делали, мы бы неожиданно перекрывали друг друга (коллизии пространства имен). Вы можете добавить функцию sum к какому-либо модулю и принять массив в качестве аргумента, если хотите . Это может означать изменение подписи на myModule.sum = function(arr, selector) {, тогда this станет arr

11
lee penkman

Или в ES6 

values.reduce((a, b) => a + b),

пример:

[1,2,3].reduce((a, b)=>a+b) // return 6
7
Honzík

Если вы хотите сбросить массив одновременно с суммированием, вы можете сделать это (скажем, stack - это массив):

var stack = [1,2,3],
    sum = 0;
while(stack.length > 0) { sum += stack.pop() };
2
btk

Вы можете использовать собственный метод карты для Массивов Метод карты (Массив) (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; });

а твой результат

1
bjhamltn

Старый способ (если у вас нет длины аргументов/параметров)

 >> 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
0
Musa

Встроенное сокращение 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);

для вашего случая. Посмотрите на это скрипка также.

0
Gismo Ranas