Tengo una serie de ejemplos de objetos a continuación:
const countriesSample = [{ name: "Yemen", capital: "Sana'a", languages: ["Arabic"], { name: "Zambia", capital: "Lusaka", languages: ["English"], }, { name: "Zimbabwe", capital: "Harare", languages: ["Shona", "English", "Northern Ndebele"], }, ];Me gustaría iterar a través de la propiedad de idiomas y devolver el número de ocurrencias de cada valor de idioma como se muestra a continuación:
[ { 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} `); } }¿Hay algún otro método en el que pueda lograr el resultado esperado sin usar bucles?
Use Array#reduce , recorriendo los idiomas de cada objeto y usando un objeto para realizar un seguimiento de la frecuencia de cada idioma.
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);