JS фильтрация элемента массива по значению во вложенном массиве

#javascript

Вопрос:

Я не могу понять, как правильно использовать .фильтр() для поиска объекта в массиве путем поиска значения во вложенном массиве.

У меня есть следующие данные:

 const orders = [
  {
    id: 1,
    items: [
      {
        itemId: "abc",
      },
      {
        itemId: "def",
      },
    ],
  },
  {
    id: 2,
    items: [
      {
        itemId: "jkl",
      },
      {
        itemId: "mno",
      },
    ],
  },
  {
    id: 3,
    items: [
      {
        itemId: "abc",
      },
      {
        itemId: "xyz",
      },
    ],
  },
];
 

У меня есть необходимое itemId: "abc" , которое мне нужно использовать, чтобы найти все объекты, в которых есть элементы, также имеющие идентификатор «abc», так что результат будет таким:

  [
  {
    id: 1,
    items: [
      {
        itemId: "abc",
      },
      {
        itemId: "def",
      },
    ],
  },
  {
    id: 3,
    items: [
      {
        itemId: "abc",
      },
      {
        itemId: "xyz",
      },
    ],
  },
 ]
 

До сих пор я пробовал следующее:

 orders amp;amp;
  orders.filter((order) => {
    return order.items.filter((item) => item.itemId === "abc");
  });
 

Но, похоже, это не работает. Что я здесь упускаю?

Комментарии:

1. Вместо этого вам нужна внутренняя функция oder.items.some . Использование фильтра внутри всегда приведет к массиву, который сохранит все элементы во внешнем фильтре (так как даже пустой массив является правдивым).

Ответ №1:

Крис Джи опередил меня в комментариях, но он прав, вам нужно использовать order.items.some в своей внутренней функции:

 const orders = [{
    id: 1,
    items: [{
        itemId: "abc",
      },
      {
        itemId: "def",
      },
    ],
  },
  {
    id: 2,
    items: [{
        itemId: "jkl",
      },
      {
        itemId: "mno",
      },
    ],
  },
  {
    id: 3,
    items: [{
        itemId: "abc",
      },
      {
        itemId: "xyz",
      },
    ],
  },
]

var ans = orders.filter((order) => {
  return order.items.some((item) => item.itemId === "abc");
});

console.log(ans) 

Ответ №2:

 const orders = [{
    id: 1,
    items: [{
        itemId: "abc",
      },
      {
        itemId: "def",
      },
    ],
  },
  {
    id: 2,
    items: [{
        itemId: "jkl",
      },
      {
        itemId: "mno",
      },
    ],
  },
  {
    id: 3,
    items: [{
        itemId: "abc",
      },
      {
        itemId: "xyz",
      },
    ],
  },
];

const result = orders.filter(order =>
  order.items.find(item => item.itemId === 'abc') !== undefined
)

console.log(result); 

Комментарии:

1. Спасибо вам за ответ! Я выбрал ответ, который включал в себя .некоторые из них после небольшого исследования.