查找每个国家的大陆

时间:2019-01-31 08:47:38

标签: javascript arrays typescript object

我有许多大洲和国家:

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(country => {
  return {
    continent: ??,
    country: country,
  }
})

我如何找到每个国家的大陆?

我尝试:

const continent = continents.forEach((continent, i) => {
  const countries = continent.countries
  if (find(countries, value.country)) return continent.continent
})

但我知道

  

[ts]并非所有代码路径都返回值。 [7030]

5 个答案:

答案 0 :(得分:5)

您可以发现continent通过检查与该值Array#findArray#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);

答案 1 :(得分:1)

您需要将map每个国家/地区名称国家/地区名称映射到newObj。然后,您可以在find()上使用continents方法来查找该大陆obj的countries数组是否包含国家名称

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

答案 2 :(得分:1)

您可以使用reduceincludes

因此,这里的想法是遍历 continent 数组,并过滤​​“ countries”数组中可用的国家。而不是通过 matchingCountry 进行映射,并创建具有所需键的对象并推送最终输出。

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)

答案 3 :(得分:1)

首先将大洲数组简化为一个键,其键值为大洲,值作为国家数组。

<?php
if ( isset($_POST["submit"]) ) {

   if ( isset($_FILES["file"])) {

        if ($_FILES["file"]["error"] > 0) {
            echo "Return Code: " . $_FILES["file"]["error"] . "<br />";
        }
        else {
                 //Print file details
             echo "Upload: " . $_FILES["file"]["name"] . "<br />";
             echo "Type: " . $_FILES["file"]["type"] . "<br />";
             echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb<br />";
              $data = [];
             foreach ($_FILES["file"]["name"] as $line) {
              $data[] = str_getcsv($line); /* <-- ERROR LINE */

               }
            }       
     } else {
             echo "No file selected <br />";
     }
    }
?>

<table width="600">
<form action="<?php echo $_SERVER["PHP_SELF"]; ?>" method="post" enctype="multipart/form-data">

<tr>
<td width="20%">Select file</td>
<td width="80%"><input type="file" name="file" id="file" /></td>
</tr>

<tr>
<td>Submit</td>
<td><input type="submit" name="submit" /></td>
</tr>

</form>
</table>

然后通过在国家/地区上运行地图来获得大洲,并在化简步骤中创建的对象内找到大洲。

let continentObj = continents.reduce((obj,currentObj) => {
obj[currentObj.continent] = currentObj.countries 
return obj
},{})

答案 4 :(得分:0)

对于多个查找,更有效的方法是创建一个查找对象:

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