我有许多大洲和国家:
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]
答案 0 :(得分:5)
您可以发现continent
通过检查与该值Array#find
和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);
答案 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)
因此,这里的想法是遍历 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 );