Dans ES6, en utilisant find
ou filter
je suis assez à l'aise pour parcourir un élément dans un tableau à l'aide d'une valeur.
Cependant, j'essaie d'obtenir une valeur à partir d'un tableau parent sur la base d'une valeur à partir d'un tableau imbriqué.
Par exemple, dans cette structure de données:
products: [
{
id: 01,
items: [
{
id: 01,
name: 'Apple'
},
{
id: 02,
name: 'banana'
},
{
id: 03,
name: 'orange'
}
]
},
{
id: 02,
items: [
{
id: 01,
name: 'carrot'
},
{
id: 02,
name: 'lettuce'
},
{
id: 03,
name: 'peas'
}
]
},
{
id: 03,
items: [
{
id: 01,
name: 'eggs'
},
{
id: 02,
name: 'bread'
},
{
id: 03,
name: 'milk'
}
]
}
]
Si je connais le name
ou id
de l'objet milk
, existe-t-il un moyen de trouver l'id de l'élément dans lequel il est imbriqué?
Actuellement, j'ai ceci:
products.find((product) => {
product.find((prod) => {
return prod.name === 'milk';
});
});
Qui ne renvoie que l'objet contenant milk
.
Vous devez renvoyer quelque chose à partir du rappel du find
externe. En fait, pour l'itération interne, vous ne devez pas utiliser find
mais plutôt some
qui renvoie un booléen pour savoir si un élément correspondant à la condition existe dans le tableau:
products.find((product) => {
return product.items.some((item) => {
//^^^^^^
return item.name === 'milk';
});
});
ou en bref:
products.find(product => product.items.some(item => item.name === 'milk'));
Vérifiez ensuite si find
a trouvé quelque chose (pas null
!) Et obtenez son .id
, le résultat doit être 03
. Alternativement, vous pouvez filter
pour les produits contenant du lait comme article, puis mapper tous les résultats à leur identifiant:
products.filter(product =>
product.items.some(item => item.name === 'milk');
).map(product =>
product.id
) // [03]