Javascript 迭代对象数组并计算某些值的出现次数
在我的Vue/Nuxt应用程序中,我有一个数组,其中包含多个对象(请参见下文) “国家”值可以重复,“投票”值也可以重复。 我想要的是一个新的对象数组,它有一个唯一的国家列表,计算“赞成”和“反对”值的总数 例如,在上面的示例中,我需要一个如下所示的数组:Javascript 迭代对象数组并计算某些值的出现次数,javascript,arrays,loops,object,Javascript,Arrays,Loops,Object,在我的Vue/Nuxt应用程序中,我有一个数组,其中包含多个对象(请参见下文) “国家”值可以重复,“投票”值也可以重复。 我想要的是一个新的对象数组,它有一个唯一的国家列表,计算“赞成”和“反对”值的总数 例如,在上面的示例中,我需要一个如下所示的数组: [{ "Country" : "Spain", "VoteFor": 1, "VoteAgainst": 0 }, { "Co
[{
"Country" : "Spain",
"VoteFor": 1,
"VoteAgainst": 0
},
{
"Country": "Italy",
"VoteFor": 2,
"VoteAgainst": 1
}]
我能够使用Set()对象获得一个唯一的国家列表
然而,我不知道如何从那里继续下去。
感谢您的帮助 将数组缩小为贴图。如果地图中不存在
国家/地区
,请为该国家/地区设置一个新对象。在对象中增加相关的投票
。使用映射的.values()
迭代器上的array.from()
将映射转换为数组
如果只有For
和再次(弃权不是选项),则可以将If…else
转换为更简单的三元组
const成员=[{“国家”:“西班牙”,“投票”:“赞成”},{“国家”:“意大利”,“投票”:“赞成”},{“国家”:“意大利”,“投票”:“赞成”},{“国家”:“意大利”,“投票”:“反对”}]
const result=Array.from(
成员
.减少((acc,o)=>{
如果(!acc.has(o.Country))acc.set(o.Country{
国家:o.国家,
VoteFor:0,
VoteAgainst:0
})
const item=acc.get(o.Country)
如果(o.Vote=='For')item.VoteFor+=1
如果(o.Vote==='反对')item.VoteAgainst+=1,则为else
返回acc
},新映射())
.values()
)
console.log(结果)
const成员=[
{“国家”:“西班牙”,“投票”:“赞成”},
{“国家”:“意大利”,“投票”:“赞成”},
{“国家”:“意大利”,“投票”:“赞成”},
{“国家”:“意大利”,“投票”:“反对”}
];
常数res=[。。。
//在更新国家/地区成员对地图时迭代成员
成员.减少((成员映射,{国家,投票})=>{
//从地图中获取成员
const member=membersMap.get(国家/地区);
//如果不存在,请添加初始投票
如果(!member)membersMap.set(国家,{Country,[投票]:1});
//否则更新当前类别的投票计数
其他成员[投票]=(成员[投票]| | 0)+1;
返回成员SMAP;
},新地图)
//返回此映射的所有值,即带有计数的成员对象
.values()];
控制台日志(res)代码>您对此进行了多深入的研究?你找到这个了吗?你将如何尝试超越你的终点?你熟悉reduce
?我在这个问题上花了大约2小时的时间,但是我的JS不是很高级,所以有时我会在基础知识上挣扎。然而,Ori的建议是有效的
[{
"Country" : "Spain",
"VoteFor": 1,
"VoteAgainst": 0
},
{
"Country": "Italy",
"VoteFor": 2,
"VoteAgainst": 1
}]
Members.forEach((Member) => {
countrySet.add(Member.Country)
})