Javascript 如何在ES6中使用reduce()计算平均值?
我试图从JSON数据中提取Javascript 如何在ES6中使用reduce()计算平均值?,javascript,ecmascript-6,Javascript,Ecmascript 6,我试图从JSON数据中提取econ和seasure(见下面的屏幕截图)。我想找到每个季节的平均经济率 例如:季节=2018年经济率=10,20,30,因此平均经济率=(10+20+30)/3=20 季节=2017年经济率=30,40,50,因此平均经济率=(30+40+50)/3=40 所以我想计算特定赛季的所有经济率之和,然后取平均值,也就是说,将特定赛季的总经济率除以该赛季的比赛数 下面是我试图在ES6中使用reduce()的代码: const economy = bowldata.redu
econ
和seasure
(见下面的屏幕截图)。我想找到每个季节的平均经济率
例如:季节=2018年经济率=10,20,30,因此平均经济率=(10+20+30)/3=20
季节=2017年经济率=30,40,50,因此平均经济率=(30+40+50)/3=40
所以我想计算特定赛季的所有经济率之和,然后取平均值,也就是说,将特定赛季的总经济率除以该赛季的比赛数
下面是我试图在ES6中使用reduce()
的代码:
const economy = bowldata.reduce( (a,{season, econ}) => {
a[season] = a[season] + parseInt(econ);
return a;
}, {});
console.log(economy);
我得到的是2018:NaN
,但我希望我的输出是2018:22、2017:50,等等。也就是说,我希望季节的关键值对和该季节的平均经济率
截图:
假设我有JSON数据:
var bowldata = [
{
season:2018
economy:10
},
{ season:2018
economy:20
},
{ season:2018
economy:30
},
{ season:2017
economy:40
},
{ season:2017
economy:50
},
{ season:2016
economy:10
},
]
现在reduce()
应该返回的对象是年份和平均经济率的键值对
结果:[2018:202017:452016:10]
变更
a[season] = a[season] + parseInt(econ);
到
这将解释尚未设置该属性的第一个实例,因此当未定义该属性时,您将把新值添加到零。第一次执行时,
a[seasure]=a[seasure]+parseInt(econ)代码>,未定义[季节]
。第一次访问时,只需使用0
对其进行初始化即可
const economy = bowldata.reduce( (a,{season, econ}) => {
if (!a[season]) {
a[season] = 0;
}
a[season] = a[season] + parseInt(econ);
return a;
}, {});
您可以将对象作为任何季节的默认值,因为您要计算平均值。为此,您还需要计数
var bowldata=[{季节:2001,经济:30'},{季节:2001,经济:40'},{季节:2001,经济:50'},{季节:2001,经济:60'},{季节:2002,经济:30'},{季节:2002,经济:40'},{季节:2002,经济:50'},{季节:2003,经济:60'},{季节:2003,经济:30'},{季节:2003,经济:40'},{季节:2003,经济:50'},{季刊:2003年,经济新闻:'60'}],
经济=保龄球数据。减少((a,{季节,经济})=>{
a[季节]=a[季节]|{总和:0,计数:0};
a[季节]。总和+=+经济;
a[季节]。平均值=a[季节]。总和/++a[季节]。计数;
返回a;
},Object.create(null)),
nice=Object.assign(…对象)
.参赛作品(经济)
.map(([k,{average}])=>({[k]:average}))
);
console.log(nice);
控制台.日志(经济型)代码>
。作为控制台包装器{max height:100%!important;top:0;}
要计算平均值而不是总数,最好采用两步流程,如下所示:
const totals = bowldata.reduce((acc, cur) => {
if (!acc[cur.season]) {
acc[cur.season] = {count: 0, total: 0};
}
acc[cur.season].count++;
acc[cur.season].total += parseInt(cur.econ);
return acc;
}, {});
const averages = {};
Object.keys(totals).forEach(key => {
averages[key] = totals[key].total / totals[key].count;
});
您好,您可以通过以下还原和映射链来解决此问题:
i) 减少到季节和经济总量
ii)获取季节和平均经济的地图
iii)获取季节和经济关键值字符串的地图
bowldata.reduce((acc,b)=>{
常数y=acc.find(x=>x.s==b.s);
y?y.e.push(b.e):acc.push({s:b.s,e:[b.e]});
返回acc
},[])
.map(x=>({s:x.s,e:x.e.reduce((acc,b,i)=>(acc*i+parseInt(b))/(i+1),0)}
)
.map(x=>(x.s+':'+x.e))
如果键(季节)不在a[seasure]=a[seasure]中,则应将a[seasure]
初始化为0?a[季节]+parseInt(经济):parseInt(经济)代码>可能重复的@MarioSantini我已编辑我的问题,请删除重复的内容。@sriharsha_bhat我已编辑我的问题,请删除重复的内容。由于a[季节]
不存在(即未定义的),请为未定义的添加一个值。试试isNaN(未定义+15)
@Bee157。我想你不明白这个答案<代码>(a[季节]| | 0)
在a[季节]
为空时返回零undefined@charlietfl你的回答是有效的,但我有一个问题:对于特定的赛季,我想把所有的经济率相加,然后除以特定赛季的比赛数。例如:2018赛季有10,20,30,40经济率,那么reduce()
返回的对象应该是年份和平均经济率的键值对。@charlietfl如果你是对的,那实际上是对问题的评论,而不是对你的答案的评论,这是正确的。这个答案只解决了OP的一部分,并不完整。它固定了总和,但不固定平均部分。实际上,平均值的计算不在OP提供的代码示例中。你的答案是正确的,但我有一个问题:对于特定的赛季,我想将所有的经济费率相加,然后除以特定赛季的比赛数。例如:2018赛季的经济率为10,20,30,40,那么reduce()返回的对象应该是年份和平均经济率的键值对您的答案有效,但我有一个问题:对于特定赛季,我想将所有经济率相加,然后除以该特定赛季的比赛数。例如:2018赛季有10,20,30,40经济率,那么reduce()返回的对象应该是年份和平均经济率的键值对您有想要的输出的示例吗?等等,我将在问题中补充我想问的是,sum
和count
来自哪里?您是否在对象a
@stonerock中声明它,它是这一行a[seasure]=a[seasure]|{sum:0,count:0}代码>,检查季节是否存在(返回一个真实值),如果不存在,则分配一个带有两个属性的obejct。
const totals = bowldata.reduce((acc, cur) => {
if (!acc[cur.season]) {
acc[cur.season] = {count: 0, total: 0};
}
acc[cur.season].count++;
acc[cur.season].total += parseInt(cur.econ);
return acc;
}, {});
const averages = {};
Object.keys(totals).forEach(key => {
averages[key] = totals[key].total / totals[key].count;
});
Hi you can solve the problem by following chain of reduce and map:
i) Reduce to season and economies aggregation
ii) Map to get season and avg economy
iii)Map to get the season and economy key value string