通过嵌套数组中的match属性查找对象

hel*_*on3 23 lodash

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
      }
    ]
  }
];
Run Code Online (Sandbox Code Playgroud)

这不起作用,因为它submodules是一个数组,而不是一个对象.是否有任何速记可以使这项工作?我试图避免手动迭代数组.

_.where(modules, {submodules:{id:3}});
Run Code Online (Sandbox Code Playgroud)

mar*_*oss 64

Lodash允许您过滤嵌套数据(包括数组),如下所示:

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

  • 您也可以使用与`_.find`完全相同的语法. (5认同)
  • 有什么方法可以只返回该嵌套对象而不是整个父对象? (5认同)
  • @DevonSams虽然`_.filter`返回已过滤的数组或空数组,而`_.find`返回匹配的元素,该元素可以是对象,数组,数字,字符串,布尔值或未定义. (2认同)

Ada*_*uch 16

这是我想出的:

_.find(modules, _.flow(
    _.property('submodules'),
    _.partialRight(_.some, { id: 2 })
));
// ? { name: 'Module1', ... }
Run Code Online (Sandbox Code Playgroud)

使用flow(),您可以构建一个可以满足您需要的回调函数.调用时,数据流经每个函数.你想要的第一件事是submodules属性,你可以使用property()函数得到它.

然后将子模块数组输入some(),如果它包含您之后的子模块,则返回true,在本例中为ID 2.

更换find()filter(),如果你正在寻找多个模块,而不只是第一个发现的.

  • 仅供参考,在Lodash 4.0中,他们删除了.any()函数.现在你将使用.some(). (2认同)