JavaScript中的数组求和值

Dan*_*uva 50 javascript arrays for-loop sum

我已经定义了一个名为的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]);
Run Code Online (Sandbox Code Playgroud)

我想知道是否可以对数组中找到的数值求和(例如0 + 0 + 21 + 2 + 0等),并且可能有一个变量,结果是我可以在脚本标记之外使用,因为我有7种这样的阵列对应于一周中的每一天.我想基于此进行比较.如果可能的话,这是采取这种行动的最佳方法吗?

Koo*_*Inc 100

你可以使用这个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);
Run Code Online (Sandbox Code Playgroud)

MDN

  • @Kooilnc请注意,`Array.reduce`是ECMAscript 5的补充,所以我的所有浏览器都不支持 - 请参阅https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/Reduce还包括一些可以实现的代码来克服这个问题 (4认同)

ruh*_*art 54

我认为最简单的方法可能是:

values.reduce(function(a, b){return a+b;})
Run Code Online (Sandbox Code Playgroud)

  • 这应该是所提出的一般问题的公认答案,但是海报的数据结构不幸地不适用于此.这确实是处理数组的最佳方法 (6认同)

Mar*_*ers 18

请尝试以下方法

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
Run Code Online (Sandbox Code Playgroud)


Xot*_*750 13

我会用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);
Run Code Online (Sandbox Code Playgroud)

可在jsfiddle使用


lee*_*man 12

创建sum方法可以很好地工作,例如,您可以将sum函数添加到Array

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;
};
Run Code Online (Sandbox Code Playgroud)

那么你可以做到

> [1,2,3].sum()
6
Run Code Online (Sandbox Code Playgroud)

在你的情况下

> myData.sum(function(item) { return item[1]; });
23
Run Code Online (Sandbox Code Playgroud)

编辑:扩展内置类型可能不受欢迎,因为如果每个人都这样做,我们会意外地相互覆盖(命名空间冲突).您可以将sum函数添加到某个模块,并根据需要接受数组作为参数.这可能意味着更改签名,myModule.sum = function(arr, selector) {然后this将成为arr


Jan*_*čík 7

或者在ES6中

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

例:

[1,2,3].reduce((a, b)=>a+b) // return 6
Run Code Online (Sandbox Code Playgroud)