如何遍历对象数组,保留其中一个对象值的计数,然后返回出现最多的一个



我一直试图在国家对象数组中获得顶级n语言,并返回顶级n语言作为该语言的对象及其计数值。我尝试使用两个循环,一个嵌套在另一个,但我卡住了。下面是country Objects数组的一个简短示例…

const countries = [
{
name: 'Afghanistan',
capital: 'Kabul',
languages: ['Pashto', 'Uzbek', 'Turkmen'],
population: 27657145,
flag: 'https://restcountries.eu/data/afg.svg',
currency: 'Afghan afghani'
},
{
name: 'Åland Islands',
capital: 'Mariehamn',
languages: ['Swedish'],
population: 28875,
flag: 'https://restcountries.eu/data/ala.svg',
currency: 'Euro'
},
{
name: 'Albania',
capital: 'Tirana',
languages: ['Albanian'],
population: 2886026,
flag: 'https://restcountries.eu/data/alb.svg',
currency: 'Albanian lek'
},
{
name: 'Algeria',
capital: 'Algiers',
languages: ['Arabic'],
population: 40400000,
flag: 'https://restcountries.eu/data/dza.svg',
currency: 'Algerian dinar'
},
{
name: 'American Samoa',
capital: 'Pago Pago',
languages: ['English', 'Samoan'],
population: 57100,
flag: 'https://restcountries.eu/data/asm.svg',
currency: 'United State Dollar'
},
{
name: 'Andorra',
capital: 'Andorra la Vella',
languages: ['Catalan'],
population: 78014,
flag: 'https://restcountries.eu/data/and.svg',
currency: 'Euro'
},
{
name: 'Angola',
capital: 'Luanda',
languages: ['Portuguese'],
population: 25868000,
flag: 'https://restcountries.eu/data/ago.svg',
currency: 'Angolan kwanza'
},
{
name: 'Anguilla',
capital: 'The Valley',
languages: ['English'],
population: 13452,
flag: 'https://restcountries.eu/data/aia.svg',
currency: 'East Caribbean dollar'
},const countries = [
{
name: 'Afghanistan',
capital: 'Kabul',
languages: ['Pashto', 'Uzbek', 'Turkmen'],
population: 27657145,
flag: 'https://restcountries.eu/data/afg.svg',
currency: 'Afghan afghani'
},
{
name: 'Åland Islands',
capital: 'Mariehamn',
languages: ['Swedish'],
population: 28875,
flag: 'https://restcountries.eu/data/ala.svg',
currency: 'Euro'
},
{
name: 'Albania',
capital: 'Tirana',
languages: ['Albanian'],
population: 2886026,
flag: 'https://restcountries.eu/data/alb.svg',
currency: 'Albanian lek'
},
{
name: 'Algeria',
capital: 'Algiers',
languages: ['Arabic'],
population: 40400000,
flag: 'https://restcountries.eu/data/dza.svg',
currency: 'Algerian dinar'
},
{
name: 'American Samoa',
capital: 'Pago Pago',
languages: ['English', 'Samoan'],
population: 57100,
flag: 'https://restcountries.eu/data/asm.svg',
currency: 'United State Dollar'
},
{
name: 'Andorra',
capital: 'Andorra la Vella',
languages: ['Catalan'],
population: 78014,
flag: 'https://restcountries.eu/data/and.svg',
currency: 'Euro'
},
{
name: 'Angola',
capital: 'Luanda',
languages: ['Portuguese'],
population: 25868000,
flag: 'https://restcountries.eu/data/ago.svg',
currency: 'Angolan kwanza'
},
{
name: 'Anguilla',
capital: 'The Valley',
languages: ['English'],
population: 13452,
flag: 'https://restcountries.eu/data/aia.svg',
currency: 'East Caribbean dollar'
}]

这是我期望得到的


// My output should look like this
console.log(mostSpokenLanguages(countries, 5))
/*[
{country: 'English',count:91},
{country: 'French',count:45},
{country: 'Arabic',count:25},
{country: 'Spanish',count:24},
{country:'Russian',count:9}
]*/

这是我尝试过的


const mostSpokenLanguage = (arr, count) => {
let languageCountObjArr = [];
let languagesArr = arr.map(countryObj => countryObj.languages);
console.log('Languages Array', languagesArr);
languagesArr.forEach(languageArr => {
for (let i = 0; i < languageArr.length; i++) {
/* I GOT STUCK HERE
let langObj = {
country: languageArr[i],
count: 1
};
if (languageCountObjArr[i].country === languageArr[i]) {
let
}*/
languageCountObjArr.push(langObj);
}
});
languageCountObjArr = languageCountObjArr.slice(count);
return languageCountObjArr;
};

我刚开始使用JavaScript几个星期了,这些东西一直让我担心。如果我能得到这个问题的答案,我将非常高兴。

你可以这样做:

const countries = [{name: 'Afghanistan',capital: 'Kabul',languages: ['Pashto', 'Uzbek', 'Turkmen'],population: 27657145,flag: 'https://restcountries.eu/data/afg.svg',currency: 'Afghan afghani',},{name: 'Åland Islands',capital: 'Mariehamn',languages: ['Swedish'],population: 28875,flag: 'https://restcountries.eu/data/ala.svg',currency: 'Euro',},{name: 'Albania',capital: 'Tirana',languages: ['Albanian'],population: 2886026,flag: 'https://restcountries.eu/data/alb.svg',currency: 'Albanian lek',},{name: 'Algeria',capital: 'Algiers',languages: ['Arabic'],population: 40400000,flag: 'https://restcountries.eu/data/dza.svg',currency: 'Algerian dinar',},{name: 'American Samoa',capital: 'Pago Pago',languages: ['English', 'Samoan'],population: 57100,flag: 'https://restcountries.eu/data/asm.svg',currency: 'United State Dollar',},{name: 'Andorra',capital: 'Andorra la Vella',languages: ['Catalan'],population: 78014,flag: 'https://restcountries.eu/data/and.svg',currency: 'Euro',},{name: 'Angola',capital: 'Luanda',languages: ['Portuguese'],population: 25868000,flag: 'https://restcountries.eu/data/ago.svg',currency: 'Angolan kwanza',},{name: 'Anguilla',capital: 'The Valley',languages: ['English'],population: 13452,flag: 'https://restcountries.eu/data/aia.svg',currency: 'East Caribbean dollar',},]
const countriesHash = countries.reduce((a, { languages }) =>
(languages.forEach((l) => (a[l] = (a[l] || 0) + 1)), a), {})
const result = Object.entries(countriesHash)
.map(([country, count]) => ({ country, count }))
.sort((a, b) => b.count - a.count)
console.log(result)

一个更动态的方法,使用基于数组的obj和它的属性,并根据它的出现次数获得计数。

const countries = [
{
name: 'Afghanistan',
capital: 'Kabul',
languages: ['Pashto', 'Uzbek', 'Turkmen']
},
{
name: 'Åland Islands',
capital: 'Mariehamn',
languages: ['Swedish']
},
{
name: 'Albania',
capital: 'Tirana',
languages: ['Albanian']
},
{
name: 'Algeria',
capital: 'Algiers',
languages: ['Arabic']
},
{
name: 'American Samoa',
capital: 'Pago Pago',
languages: ['English', 'Samoan']
},
{
name: 'Andorra',
capital: 'Andorra la Vella',
languages: ['Catalan']
},
{
name: 'Angola',
capital: 'Luanda',
languages: ['Portuguese']
},
{
name: 'Anguilla',
capital: 'The Valley',
languages: ['English']
},
{
name: 'Afghanistan',
capital: 'Kabul',
languages: ['Pashto', 'Uzbek', 'Turkmen']
},
{
name: 'Åland Islands',
capital: 'Mariehamn',
languages: ['Swedish']
},
{
name: 'Albania',
capital: 'Tirana',
languages: ['Albanian']
},
{
name: 'Algeria',
capital: 'Algiers',
languages: ['Arabic']
},
{
name: 'American Samoa',
capital: 'Pago Pago',
languages: ['English', 'Samoan']
},
{
name: 'Andorra',
capital: 'Andorra la Vella',
languages: ['Catalan']
},
{
name: 'Angola',
capital: 'Luanda',
languages: ['Portuguese']
},
{
name: 'Anguilla',
capital: 'The Valley',
languages: ['English']
}]
function groupBy(objectArray, property) { 
return objectArray.reduce(function (acc, obj) {
let key = obj[property]
if (!acc[key]) {
acc[key] = {}
acc[key][property] = key
acc[key].count = 0
}
acc[key].count++
return acc 
}, {})
}

const result = groupBy(countries, 'name')
console.log(result)

最新更新