如何计算对象数组中属性值的出现次数



我有一个对象数组示例如下:

const countriesSample = [{
name: "Yemen",
capital: "Sana'a",
languages: ["Arabic"],
{
name: "Zambia",
capital: "Lusaka",
languages: ["English"],
},
{
name: "Zimbabwe",
capital: "Harare",
languages: ["Shona", "English", "Northern Ndebele"],
},
];

我想遍历languages属性并返回每个语言值的出现次数,如下所示:

[
{ language: "English", count: 2 },
{ language: "Arabic", count: 1 },
{ language: "Shona", count: 1 },
{ language: "Northern Ndebele", count: 1 }

];
我已经尝试遍历对象,但它没有返回任何值:

let totalOccurence = 0;
for (let i = 0; i < countries.length; i++) {
for (let j = 0; j < countries[i].length; j++) {
totalOccurence += countries[j].length;
console.log(`language: ${countries[j].languages}, count:${totalOccurence} `);
}
}

有没有其他的方法,我可以达到预期的结果,而不使用循环?

使用Array#reduce,循环遍历每个对象的语言,并使用一个对象来跟踪每种语言的频率。

const countriesSample=[{name:"Yemen",capital:"Sana'a",languages:["Arabic"]},{name:"Zambia",capital:"Lusaka",languages:["English"]},{name:"Zimbabwe",capital:"Harare",languages:["Shona","English","Northern Ndebele"]}];
let res = Object.values(countriesSample.reduce((acc, {languages})=>{
languages.forEach(language => ++(acc[language] ??= {language, count: 0}).count);
return acc;
},{}));
console.log(res);

最新更新