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.