web-dev-qa-db-ja.com

ネストされた配列の一致プロパティでオブジェクトを検索

条件にネストされた配列が含まれる場合、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}});
22
helion3

ここに私が思いついたものがあります:

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

flow() を使用すると、必要なことを行うコールバック関数を作成できます。呼び出すと、データが各関数を流れます。最初に必要なものはsubmodulesプロパティであり、 property() 関数を使用して取得できます。

次に、サブモジュール配列が some() に入力されます。これは、目的のサブモジュール、この場合はID _2_を含む場合にtrueを返します。

最初に見つかったモジュールだけでなく、複数のモジュールを探している場合は、find()filter()に置き換えます。

15
Adam Boduch

Lodashを使用すると、次のようにネストされたデータ(配列を含む)をフィルタリングできます。

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

57
martinoss

モジュールを取得するために、関数を使用するのが最善のチャンスだと思います。

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

サブモジュールを取得するためにこれを試してください

。where(。pluck(modules、 "submodules")、{submodules:{id:3}});

0
Mabedan