Javascript 如何使用reduce()计算总计(ES6)?
我的数据有Javascript 如何使用reduce()计算总计(ES6)?,javascript,ecmascript-6,Javascript,Ecmascript 6,我的数据有季节和部署阵列部署阵列有3个参数捕获,输出,树桩。我想计算总的捕获量,树桩,出栏量 var data = [ { season:2015, fielding:{Catches:2, Runouts:1, Stumpings:1 }, { season:2016, fielding:{Catches:0, Runouts:1, Stumpings:1 }, { season:2016, fieldin
季节
和部署
阵列<代码>部署阵列有3个参数捕获
,输出
,树桩
。我想计算总的捕获量
,树桩
,出栏量
var data = [
{
season:2015,
fielding:{Catches:2, Runouts:1, Stumpings:1
},
{
season:2016,
fielding:{Catches:0, Runouts:1, Stumpings:1
},
{
season:2016,
fielding:{Catches:0, Runouts:0, Stumpings:0
},
{
season:2017,
fielding:{Catches:1, Runouts:3, Stumpings:1
},
{
season:2017,
fielding:{Catches:2, Runouts:1, Stumpings:2
}
]
我希望最终输出为对象,如下所示:
Catches -> 2+0+0+1+2 = 5
Runouts -> 1+1+0+3+1 = 6
Stumpings -> 1+1+0+1+2 =5
我尝试的是:
let dismissals = data.reduce( (a,{season, fielding}) => {
if(!a[fielding.Catches]){
a[fielding.Catches] = {};
}else if(a[fielding.Runouts]){
a[fielding.Runouts] = {};
}else if(a[fielding.Stumpings]){
a[fielding.Stumpings] = {};
}else{
a[fielding.Stumpings] += 1;
a[fielding.Runouts] += 1;
a[fielding.Catches] += 1;
}
return a;
}, {});
我的代码不计算所需的输出,并给出NaN
迭代fielding
的条目,并将该值添加到累加器中的[key]中(如果该键尚不存在,则默认为0
):
var数据=[{赛季:2015,防守:{渔获量:2,出局:1,立木:1}},{赛季:2016,防守:{渔获量:0,出局:1,立木:1},{赛季:2016,防守:{渔获量:0,出局:0,立木:0},{赛季:2017,防守:{渔获量:1,出局:3,立木:1},{赛季:2017,防守:{赛季:2,出局:1,立木:2};
console.log(
data.reduce((a,{fielding})=>{
Object.entries(fielding).forEach(([key,val])=>{
如果(键!=''u id')a[键]=(a[键]| | 0)+val;
});
返回a;
}, {})
);
迭代字段的条目,并将值添加到累加器中的[键](如果键尚不存在,则默认为0
):
var数据=[{赛季:2015,防守:{渔获量:2,出局:1,立木:1}},{赛季:2016,防守:{渔获量:0,出局:1,立木:1},{赛季:2016,防守:{渔获量:0,出局:0,立木:0},{赛季:2017,防守:{渔获量:1,出局:3,立木:1},{赛季:2017,防守:{赛季:2,出局:1,立木:2};
console.log(
data.reduce((a,{fielding})=>{
Object.entries(fielding).forEach(([key,val])=>{
如果(键!=''u id')a[键]=(a[键]| | 0)+val;
});
返回a;
}, {})
);
您可以使用reduce和loopfielding
的Object.keys
const res=data.reduce((a,{fielding})=>
Object.keys(fielding).forEach(f=>a[f]=(a[f]| | 0)+fielding[f])| | a
,Object.create(null));
控制台日志(res)代码>
风险值数据=[
{
季节:2015年,
防守:{接球数:2,出局数:1,立木数:1}
},
{
季节:2016年,
接球:{接球数:0,出局数:1,立木数:1}
},
{
季节:2016年,
接球:{接球数:0,出局数:0,立桩数:0}
},
{
季节:2017年,
防守:{接球数:1,出局数:3,立木数:1}
},
{
季节:2017年,
防守:{接球数:2,出局数:1,立木数:2}
}
];
您可以使用reduce and loopfielding
的Object.keys
const res=data.reduce((a,{fielding})=>
Object.keys(fielding).forEach(f=>a[f]=(a[f]| | 0)+fielding[f])| | a
,Object.create(null));
控制台日志(res)代码>
风险值数据=[
{
季节:2015年,
防守:{接球数:2,出局数:1,立木数:1}
},
{
季节:2016年,
接球:{接球数:0,出局数:1,立木数:1}
},
{
季节:2016年,
接球:{接球数:0,出局数:0,立桩数:0}
},
{
季节:2017年,
防守:{接球数:1,出局数:3,立木数:1}
},
{
季节:2017年,
防守:{接球数:2,出局数:1,立木数:2}
}
];
你为什么要将你想成为数字的东西初始化为空对象?@jornsharpe哦,好吧,下次我想创建object时,我会记住这一点。他的意思是,`a[fielding.catch]={};`应为'a[fielding.catch]=0`你为什么要把你想成为一个数字的东西初始化为一个空对象?@jornsharpe哦,好吧,下次我想创建object时,我会记住这一点。他的意思是,`a[fielding.catch]={};`应为'a[fielding.catch]=0`因此,fielding中的每个参数都变成了一个键
,val
只是不断地为特定的键值添加,对吗?嗯,fielding
是一个具有属性(键)和值的对象,不是函数-它没有参数。哦,好吧,很抱歉使用了错误的术语,但我明白了你的意思:)实际上我的数据存储在mongoDB中,所以当使用forEach()时
它还将\u id
记录在控制台中,我怎么能跳过它。我可以用能提供相同输出的东西替换forEach吗。因此,fielding中的每个参数都成为一个键,而val
只是不断地为特定的键值添加,对吗?嗯,fielding
是一个具有属性(键)的对象还有值,不是函数-它没有参数。哦,好吧,很抱歉使用了错误的术语,但我明白了你的意思:)事实上,我的数据存储在mongoDB中,所以当使用forEach()
时,它也会在控制台中记录\u id
我怎么能跳过它。我能用能提供相同输出的东西替换forEach吗。