Javascript 迭代对象数组并计算某些值的出现次数

Javascript 迭代对象数组并计算某些值的出现次数,javascript,arrays,loops,object,Javascript,Arrays,Loops,Object,在我的Vue/Nuxt应用程序中,我有一个数组,其中包含多个对象(请参见下文) “国家”值可以重复,“投票”值也可以重复。 我想要的是一个新的对象数组,它有一个唯一的国家列表,计算“赞成”和“反对”值的总数 例如,在上面的示例中,我需要一个如下所示的数组: [{ "Country" : "Spain", "VoteFor": 1, "VoteAgainst": 0 }, { "Co

在我的Vue/Nuxt应用程序中,我有一个数组,其中包含多个对象(请参见下文)

“国家”值可以重复,“投票”值也可以重复。 我想要的是一个新的对象数组,它有一个唯一的国家列表,计算“赞成”和“反对”值的总数

例如,在上面的示例中,我需要一个如下所示的数组:

[{
   "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)
      })