1
votes

Renvoyer la correspondance du parent dans la boucle imbriquée en utilisant ES6

J'ai un tableau d'objets région qui contiennent chacun un tableau de pays. Je souhaite renvoyer une région dès que l'un de ses codes iso de pays correspond au this.isoCodes.code pré-rempli. Le code actuel utilise une boucle imbriquée avec des pauses, mais c'est désordonné. Vous recherchez une solution plus propre avec ES6 si possible. Je sais qu'il y a des choses comme .map avec .every ou .some mais je ne sais pas ce qui me donnerait le résultat correct.

Le le code de travail actuel ressemble à

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


2 commentaires

Puis-je suggérer d'ajouter des exemples de données pour votre question?


vous pourriez envelopper dans lambda qui vous permettrait de faire un retour plutôt que plusieurs pauses. Vous pouvez également utiliser Array.includes.


3 Réponses :


2
votes

Utilisez une combinaison de .find pour parcourir les régions et .some pour voir si l'un des pays code> dans une région réussir le test:

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;


1 commentaires

J'adore quand le code ressemble à une œuvre d'art! Merci!



-1
votes

Vous pouvez utiliser _.find () de la bibliothèque js lodash :

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


0 commentaires

0
votes
// 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

0 commentaires