J'ai un tableau de continents et de pays:
const continent = continents.forEach((continent, i) => {
const countries = continent.countries
if (find(countries, value.country)) return continent.continent
})
Et un tableau de certains pays:
const result = countries.map(country => {
return {
continent: ??,
country: country,
}
})
Je veux parcourir pays et renvoyer un tableau d'objets comme celui-ci:
const countries = ['Angola', 'Andorra']
Comment puis-je trouver le continent de chaque pays?
J'essaye ceci:
const continents = [
{
continent: 'Europe',
countries: [
'Albania',
'Andorra',...
],
},
{
continent: 'Asia',
countries: [
'Afghanistan',
'Bahrain',...
],
},
{
continent: 'Africa',
countries: [
'Algeria',
'Angola',...
],
},
{
continent: 'Americas',
countries: [
'Antigua and Barbuda',
'Bahamas',...
],
},
]
Mais j'obtiens
[ts] Tous les chemins de code ne renvoient pas une valeur. [7030]
5 Réponses :
Vous pouvez trouver continent en vérifiant la valeur avec Array # find et Array # includes
const
continents = [{ continent: 'Europe', countries: ['Albania', 'Andorra'] }, { continent: 'Asia', countries: ['Afghanistan', 'Bahrain'] }, { continent: 'Africa', countries: ['Algeria', 'Angola'] }, { continent: 'Americas', countries: ['Antigua and Barbuda', 'Bahamas'] }],
countries = ['Angola', 'Andorra'],
result = countries.map(country => ({
continent: continents.find(({ countries }) =>
countries.includes(country)).continent,
country,
}));
console.log(result);
Vous devez mapper map chaque nom de pays nom de pays à newObj. Ensuite, vous pouvez utiliser la méthode find () sur continents pour savoir si le tableau countries de cet obj de continent contient le nom du pays ou non
const continents = [
{
continent: 'Europe',
countries: [
'Albania',
'Andorra'
],
},
{
continent: 'Asia',
countries: [
'Afghanistan',
'Bahrain'
],
},
{
continent: 'Africa',
countries: [
'Algeria',
'Angola'
],
},
{
continent: 'Americas',
countries: [
'Antigua and Barbuda',
'Bahamas'
],
},
]
const countries = ['Angola', 'Andorra']
const result = countries.map(count => {
const obj = {country:count};
//get the continent object from array continents which includes 'count' in its countries array
const continentObj = continents.find(continent=>continent.countries.includes(count));
//add continent name to the obj as continent name in continentObj
obj.continent = continentObj.continent;
return obj;
})
console.log(result);
Vous pouvez utiliser réduire a > et inclut .
Donc ici l'idée est de parcourir le tableau continent et de filtrer les pays qui sont disponibles dans le tableau des pays. Ensuite, mappez sur matchingCountry et créez un objet avec les clés souhaitées et appuyez sur la sortie finale.
const continents = [{ continent:'Europe',countries: ['Albania','Andorra',],},{continent: 'Asia',countries: ['Afghanistan', 'Bahrain', ], },{continent: 'Africa',countries: ['Algeria', 'Angola',],},{continent: 'Americas',countries: [ 'Antigua and Barbuda','Bahamas',],},]
const countries = ['Angola','Andorra', 'Andorra', 'Bahamas']
const output = continents.reduce((op,cur) => {
let matchCounrty = cur.countries.filter(e => countries.includes(e) )
if( matchCounrty && matchCounrty.length ){
let desiredObject = matchCounrty.map(e => ({
continent: cur.continent,
country: e
}))
op.push(desiredObject)
}
return op
},[])
console.log(output)
Commencez par réduire le tableau des continents en un objet avec la clé comme continent et la valeur comme tableau des pays.
const countryObj = countries.map(country => {
const continent = Object.keys(continentObj).find(continentName => continentObj[continentName].indexOf(country) > -1)
return {
continent,
country
}
})
console.log(countryObj)
Ensuite, obtenez le continent en exécutant une carte sur les pays et trouvez le continent à l'intérieur de l'objet créé à l'étape de réduction.
let continentObj = continents.reduce((obj,currentObj) => {
obj[currentObj.continent] = currentObj.countries
return obj
},{})
Pour plusieurs recherches, une approche plus efficace serait de créer un objet de recherche:
const lookup = {}, countries = ['Angola', 'Andorra'], continents = [ { continent: 'Europe', countries: [ 'Albania', 'Andorra' ], }, { continent: 'Asia', countries: [ 'Afghanistan', 'Bahrain' ], }, { continent: 'Africa', countries: [ 'Algeria', 'Angola' ], }, { continent: 'Americas', countries: [ 'Antigua and Barbuda', 'Bahamas' ] } ];
for (let obj of continents)
for (let country of obj.countries)
lookup[country] = obj.continent;
const result = countries.map(country => ({ country, continent: lookup[country] }));
console.log( result );
console.log( lookup );
A noter que
returnà l'intérieur de.forEachne fait rien ..forEachne renvoie aucune valeur.