@pcdesign

Как отфильтровать список объектов в сложной структуре и вытащить нужные значения?

Вот такая структура:

const msg = {
  razd: {
    one: {
      category: [{
        "_id": 1, "cat_name": "tst"
      }, {
        "_id": 2, "cat_name": "goo"
      }, {
        "_id": 4, "cat_name": "hoo"
      },
      ]},
    two: {
      category: [{
        "_id": 7, "cat_name": "hoo"
      }, {
        "_id": 9, "cat_name": "bar"
      },]
    }
  }};


Вот список _id, которые нужно отфильтровать:
const expect = [4, 7]

Ожидаемый результат:
[{ "_id": 4, "cat_name": "hoo"}, {"_id": 7, "cat_name": "hoo"}}

Как это по модному сделать?
  • Вопрос задан
  • 95 просмотров
Решения вопроса 1
0xD34F
@0xD34F Куратор тега JavaScript
Первым делом надо выдернуть из объекта msg.razd массив значений:

const arr = Object.values(msg.razd);.

Затем из вложенных массивов следует собрать один общий:

const categories = arr.flatMap(n => n.category);

// или

const categories = [].concat.apply([], arr.map(n => n.category));

// или

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

И, наконец, достать из полученного массива объекты с указанными id:

const result = categories.filter(n => expect.includes(n._id));

// или

const result = categories.filter(function(n) {
  return this.has(n._id);
}, new Set(expect));

// или

const categoriesObj = Object.fromEntries(categories.map(n => [ n._id, n ]));
const result = expect.reduce((acc, n) => ((n = categoriesObj[n]) && acc.push(n), acc), []);
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
29 мар. 2024, в 17:04
5000 руб./за проект
29 мар. 2024, в 17:03
3000 руб./за проект
29 мар. 2024, в 16:58
3000 руб./за проект