当我的条件涉及嵌套数组时,我没有看到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}});
答案 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}});