@fessss

Как из вложенных массивов достать объекты с известными значениями определённого свойства?

Есть массив:

const arr = [
  {
    'name': 'test1',
    'items': [
      {
        'name': 'test1-1',
        id: 1
      },
      {
        'name': 'test1-2',
        id: 2
      },
      {
        'name': 'test1-3',
        id: 3
      }
    ]
  },
  {
    'name': 'test2',
    'items': [
      {
        'name': 'test2-1',
        id: 5
      },
      {
        'name': 'test2-2',
        id: 9
      },
      {
        'name': 'test2-3',
        id: 10
      }
    ]
  }
]

Нужно получить из него массив объектов с id 9 и 10, то есть

result = [
  {
    'name': 'test2-2',
    id: 9
  },
  {
    'name': 'test2-3',
    id: 10
  }
]
  • Вопрос задан
  • 1972 просмотра
Решения вопроса 3
hzzzzl
@hzzzzl
arr
  .map(a => a.items)
  .flat()
  .filter(item => [9, 10].includes(item.id))
Ответ написан
Комментировать
0xD34F
@0xD34F Куратор тега JavaScript
Идентификаторы объектов, которые хотим получить, сложим в массив:

const ids = [ 9, 10 ];

Вложенные массивы объектов соберём в один общий:

const items = arr.flatMap(n => n.items);

// или

const items = Array.prototype.concat.apply([], arr.map(n => n.items));

// или

const items = arr.reduce((acc, n) => (acc.push(...n.items), acc), []);

Извлечём объекты:

const result = items.filter(n => ids.includes(n.id));

// или

const result = items.filter(function(n) {
  return this.has(n.id);
}, new Set(ids));

// или

const itemsObj = Object.fromEntries(items.map(n => [ n.id, n ]));
const result = ids.reduce((acc, n) => ((n = itemsObj[n]) && acc.push(n), acc), []);
Ответ написан
Комментировать
sergiks
@sergiks Куратор тега JavaScript
♬♬
arr.reduce((acc, c) => acc.concat(...c.items.filter(e => [9,10].indexOf(e.id) > -1)), [])
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы