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;
}
3 Réponses :
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;
J'adore quand le code ressemble à une œuvre d'art! Merci!
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; });
// 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
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.