从 JavaScript 中的键值对数组中求和值
Posted
技术标签:
【中文标题】从 JavaScript 中的键值对数组中求和值【英文标题】:Sum values from an array of key-value pairs in JavaScript 【发布时间】:2013-04-10 01:48:55 【问题描述】:我已经定义了一个名为 myData
的 javascript 变量,它是一个 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) => (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) => 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;) @netpoeticamyData.map(function(o) return o[1]; ).reduce(a, b) return a + b; )
使用 EC6,这可能看起来像 values.reduce((a + b) => 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 中的键值对数组中求和值的主要内容,如果未能解决你的问题,请参考以下文章