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和loop
fielding
的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 loop
fielding
的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吗。