从 JavaScript 中的键值对数组中求和值

Posted

技术标签:

【中文标题】从 JavaScript 中的键值对数组中求和值【英文标题】:Sum values from an array of key-value pairs in JavaScript 【发布时间】:2013-04-10 01:48:55 【问题描述】:

我已经定义了一个名为 myDatajavascript 变量,它是一个 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】:

使用这个code的新方法

  <script>
var array = [1, 2, 3, 4, 5];

// Getting sum of numbers
var sum = array.reduce(function(a, b)
    return a + b;
, 0);

console.log(sum);

【讨论】:

【参考方案2】:

其中0是初始值

Array.reduce((currentValue, value) => currentValue +value,0)

Array.reduce((currentValue, value) => return currentValue +value,0)

[1,3,4].reduce(function(currentValue, value)  return currentValue + value,0)

【讨论】:

【参考方案3】:

您可以使用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

【讨论】:

我猜应该是prev[1]。无论如何,结果不会给23 @Kooilnc 请注意,Array.reduce 是 ECMAscript 5 的补充,因此并非所有浏览器都支持我 - 请参阅此处 developer.mozilla.org/en-US/docs/JavaScript/Reference/…,其中还包含一些可以实施以克服此问题的代码跨度> @VisioN:忘记了初始值,添加了它。不,它不应该是 prev[1] @MarkWalters:是的,但是可以使用 MDN 链接中的垫片(见答案) 带有 ES6 箭头函数:var sum = myData.reduce((sum, current) =&gt; (sum + current[1]), 0);【参考方案4】:

旧方法(如果你现在不知道参数/参数的长度)

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

【讨论】:

【参考方案5】:

或者在 ES6 中

values.reduce((a, b) =&gt; a + b),

示例:

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

【讨论】:

【参考方案6】:

您可以对数组使用本机 map 方法。 map Method (Array) (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 是你的结果

【讨论】:

【参考方案7】:

如果你想在求和的同时丢弃数组,你可以这样做(比如,stack 是数组):

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

【讨论】:

【参考方案8】:

创建一个 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;
;

那你就可以了

> [1,2,3].sum()
6

在你的情况下

> myData.sum(function(item)  return item[1]; );
23

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

【讨论】:

【参考方案9】:

试试下面的

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

【讨论】:

我想你的意思是myData[i][1]。如果值已经是一个数字,为​​什么还要使用parseFloat 它输出 24156 而不是应该的 3。我用“空值数组”进行了测试,我收到了相同的输出... @FelixKling 它适用于myData[i][1],但我如何使 myTotal 在其他脚本标签中可用? Daniel,您修正了 Felix Kling 指出的错字吗?请记住在示例中写“myData[i][1]”而不是错误的版本:“myData[1]”。 @FelixKling 感谢编辑,我想我使用 parseFloat 过于谨慎了。丹妮拉我已经测试过了,看看这里 - jsbin.com/ibajas/1【参考方案10】:

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

values.reduce(function(a, b)return a+b;)

【讨论】:

这应该是对所提出的一般问题的公认答案,但不幸的是,发帖者的数据结构不适用于此问题。这确实是处理数字数组的最佳方式 确保它们是数字不会受到伤害:values.reduce(function(a, b)return +a + +b;) @netpoetica myData.map(function(o) return o[1]; ).reduce(a, b) return a + b; ) 使用 EC6,这可能看起来像 values.reduce((a + b) =&gt; a + b)【参考方案11】:

数组的javascript内置reduce不是标准的,但是可以使用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。

【讨论】:

【参考方案12】:

我会使用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上可用

【讨论】:

以上是关于从 JavaScript 中的键值对数组中求和值的主要内容,如果未能解决你的问题,请参考以下文章

如何从飞镖颤动中的键或键值对获取索引

EasyClick JavaScript 键值对存值

map 中的键值都可以是啥类型的啊

BigQuery:将数组中的键值对转换为列

PHP从多个json文件中的键值排序结果

使用列表中的每个值作为键值对中的键