web-dev-qa-db-fra.com

ES6 - Recherche de données dans des tableaux imbriqués

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.

14
Toby

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]
36
Bergi