Javascript 具有条件的数组的和

Javascript 具有条件的数组的和,javascript,arrays,ecmascript-6,reduce,Javascript,Arrays,Ecmascript 6,Reduce,我想对数组的元素值求和,它们具有相同的年份 var newData=[]; var数据=新数组(['2013',0],'2013',0],'2016',15],'2017',2],'2015',1],'2013',0],'2016',12],'2014',0],'2017',3],'2015',1],'2013',21],'2013',2]); var sum=数据减少(函数(a、b、i){ 如果(b[0][i]==b[0][i+1]){ 返回newData.push(b[0],a+b[1])

我想对数组的元素值求和,它们具有相同的年份

var newData=[];
var数据=新数组(['2013',0],'2013',0],'2016',15],'2017',2],'2015',1],'2013',0],'2016',12],'2014',0],'2017',3],'2015',1],'2013',21],'2013',2]);
var sum=数据减少(函数(a、b、i){
如果(b[0][i]==b[0][i+1]){
返回newData.push(b[0],a+b[1]);
}    
}, 0);
console.log(newData);
//返回:
[
["2013",23],
["2014",0],
["2015",2],
["2016",27],
["2017",5]

]
您可以创建自己的简单且更易于理解的自定义逻辑,如下所示

获取JSON对象作为响应。

var newData=[];
var数据=新数组(['2013',0],'2013',0],'2016',15],'2017',2],'2015',1],'2013',0],'2016',12],'2014',0],'2017',3],'2015',1],'2013',21],'2013',2]);
var res={};
data.forEach((项目)=>{
if(对象键(res.)包括(项[0])){
res[项目[0]+=项目[1];
}否则{
res[项目[0]]=项目[1];
}   
});
控制台日志(res)

.as控制台包装{max height:100%!important;top:0;}
如果我了解您需要什么,请尝试此方法

var sums=data.reduce(function(a,b){
    a[b[0]]=(a[b[0]] || 0)+b[1];
},{});

您可以使用ES6
Map
reduce
方法按年份求和,并扩展语法
从Map中获取数组

var数据=新数组([2013',0]、'2013',0]、'2016',15]、'2017',2]、'2015',1]、'2013',0]、'2016',12]、'2014',0]、'2017',3]、'2015',1]、'2013',21]、'2013',2]);
const result=data.reduce((r[y,v])=>{
r、 集合(y,(r.get(y)| | 0)+v);
返回r;
},新地图)

console.log([…结果])完成这项工作的一种非常快速的方法是使用JS的稀疏数组并挑选非空插槽

var数据=[[2013',0],'2013',0],'2016',15],'2017',2],'2015',1],'2013',0],'2016',12],'2014',0],'2017',3],'2015',1],'2013',21],'2013',2],
中期=数据.reduce((r,e)=>(r[+e[0]]和&(r[+e[0]][1]+=e[1])| |(r[+e[0]]=e),r),[]),
结果=Object.keys(临时)
.map(k=>中间[k]);
控制台日志(结果)
。作为控制台包装器{
身高:100%;
最大高度:100%!重要

}
为什么不将结果作为一个对象,其中键是年份和值-总和?这是在手机上写的,所以我不确定它是否有效<代码>设s=data.reduce((o,e)=>(o[e[0]]=~~o[e[0]]]+e[1,o),{});Object.keys(s.map(e=>[e,s[e]])
是的,你说得对