使用ES6在嵌套循环中返回父项匹配项

时间:2019-01-02 00:27:25

标签: javascript loops ecmascript-6

我有一个区域对象数组,每个对象都包含一个国家/地区数组。我要在一个国家的ISO代码与预先填充的this.isoCodes.code匹配时返回一个区域。当前代码使用带中断的嵌套循环,但是很混乱。如果可能,使用ES6寻找更清洁的解决方案。我知道有些.map.every.some之类的东西,但不确定是什么能给我正确的结果。

当前工作代码如下

let result;

for (let i=0; i<regions.length; i++) {
  for (let j=0; j<regions[i].countries.length; j++) {
    let country = regions[i].countries[j];
    if (country.iso2 === this.isoCodes.code || country.iso3 === this.isoCodes.code) {
      result = regions[i];
      break;
    }
  }
  if (result) {
    break;
  }
}
if (result) {
  this.region = result;
  return result;
} else {
  return false;
}

3 个答案:

答案 0 :(得分:2)

结合使用.findregions遍历.somecountry来查看region中的const { code } = this.isoCodes; const foundRegion = regions.find(({ countries }) => ( countries.some(({ iso2, iso3 }) => ( iso2 === code || iso3 === code )) )); if (foundRegion) { this.region = foundRegion; return foundRegion; } return false; 中的任何一个是否通过测试:

$xarray = array($x => "space" . $x);
echo "<p id=$xarrray[$x]></p>";

答案 1 :(得分:0)

// assuming this is similar to the data
const isoCodes = {
  code: 'foo',
};

const regions = [
  {
    countries: [
      { iso2: 'foo', iso3: 'foo' },
      { iso3: 'bar' },
    ],
  },
];

return regions.reduce((acc, region) => {
  // already found region, skip
  if(acc) {
    return acc;
  }

  // check if any country matches in region, if so we use it
  const [first] = region.countries.filter(({ iso2, iso3 }) => 
    (iso2 === isoCodes.code || iso3 === isoCodes.code));
  if (first) {
    return region;
  }
});

JSFiddle

答案 2 :(得分:-1)

您可以从js库lodash中使用_.find():

var users = [
{ 'user': 'barney',  'age': 36, 'active': true },
{ 'user': 'fred',    'age': 40, 'active': false },
{ 'user': 'pebbles', 'age': 1,  'active': true }
];

_.find(users, function(o) { return o.age < 40; });