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

时间:2015-05-07 17:02:00

标签: 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
      }
    ]
  }
];

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

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

4 个答案:

答案 0 :(得分:51)

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

http://localhost/test?sports[]

答案 1 :(得分:15)

这是我想出的:

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

使用flow(),您可以构建一个可以满足您需要的回调函数。通话时,数据流过通过每个功能。您想要的第一件事是submodules属性,您可以使用property()函数来获取该属性。

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

如果您要查找多个模块,请将find()替换为filter(),而不只是找到第一个模块。

答案 2 :(得分:1)

我对此进行了调查,我认为最好的选择是使用Deepdash。这是用于深层过滤,查找等的方法的集合。

当然,单独使用lodash可能会实现,但是使用Deepdash会更容易。

我试图将先前的答案转换为最新的Lodash版本,但这没有用。 Lodash的v4中不推荐使用每种方法。可能的替换:选择=地图或过滤器,任意=一些,其中=过滤器)

Text("some text").font(Font.title) 将带有一些信息的对象返回到找到的项目(只是一些值,有关更多详细信息,请参见docs

  • findDeep是找到的对象
  • value是嵌套数组中的索引
  • key值的父项

因此parent的代码如下:

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

const getModule = (modules, id) =>
  _.findDeep(modules, module => module.id === id, {
    childrenPath: "submodules"
  });


const resultEl = document.getElementById("result");
const foundModule = getModule(modules, 3).value;

resultEl.innerText = JSON.stringify(foundModule, null, 2);

答案 3 :(得分:0)

我认为你最好的机会是使用一个函数来获取模块。

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

尝试获取子模块

.where( .pluck(modules,“submodules”),{submodules:{id:3}});