I have an array of objects sample below:
const countriesSample = [{
name: "Yemen",
capital: "Sana'a",
languages: ["Arabic"],
{
name: "Zambia",
capital: "Lusaka",
languages: ["English"],
},
{
name: "Zimbabwe",
capital: "Harare",
languages: ["Shona", "English", "Northern Ndebele"],
},
];
I'd like to iterate through languages property and return the number of occurrence of each language value like below:
[
{ 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} `);
}
}
Is there any other method that I can achieve the expected result without using loops?
Use Array#reduce, looping over the languages for each object and using an object to keep track of the frequency of each language.
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);