Найти объект по свойству match в вложенном массиве - программирование

Найти объект по свойству match в вложенном массиве

Я не вижу способ к объектам find, когда мое условие связано с вложенным массивом.

var modules = [{
    name: 'Module1',
    submodules: [{
        name: 'Submodule1',
        id: 1
      }, {
        name: 'Submodule2',
        id: 2
      }
    ]
  }, {
    name: 'Module2',
    submodules: [{
        name: 'Submodule1',
        id: 3
      }, {
        name: 'Submodule2',
        id: 4
      }
    ]
  }
];

Это не сработает, потому что submodules - это массив, а не объект. Есть ли сокращение, которое сделало бы эту работу? Я пытаюсь избежать итерации массива вручную.

_.where(modules, {submodules:{id:3}});
4b9b3361

Ответ 1

Вот что я придумал:

_.find(modules, _.flow(
    _.property('submodules'),
    _.partialRight(_.some, { id: 2 })
));
// → { name: 'Module1', ... }

Используя flow(), вы можете создать функцию обратного вызова, которая делает то, что вам нужно. При вызове данные передаются через каждую функцию. Первое, что вам нужно, это свойство submodules, и вы можете получить это, используя функцию свойство().

Затем массив подмодулей подается в some(), который возвращает true, если он содержит подмодуль, за которым вы находитесь, в этом случае, ID 2.

Замените find() на filter(), если вы ищете несколько модулей, а не только первый найденный.

Ответ 2

Lodash позволяет фильтровать вложенные данные (включая массивы) следующим образом:

_.filter(modules, { submodules: [ { id: 2 } ]});

Ответ 3

Я думаю, что ваш лучший шанс - использовать функцию для получения модуля.

_.select(modules, function (module) {
  return _.any(module.submodules, function (submodule) {
    return _.where(submodule, {id:3});
  });
});

попробуйте это для получения подмодуля

.where(.pluck(модули, "подмодули" ), {подмодули: {id: 3}});