4
votes

Trouvez le continent de chaque pays

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]


1 commentaires

A noter que return à l'intérieur de .forEach ne fait rien . .forEach ne renvoie aucune valeur.


5 Réponses :


4
votes

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);


0 commentaires

0
votes

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);


0 commentaires

0
votes

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)


0 commentaires

0
votes

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
},{})


0 commentaires

0
votes

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 );


0 commentaires