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.forEach
ne fait rien ..forEach
ne renvoie aucune valeur.