说原始集合是:
var data = [{
id: 1,
children: [{
id: 2
}, {
id: 3
}]
}, {
id: 4,
children: [{
id: 5
}]
}]
想要使用id
属性的给定值:
var selectedIds = [1, 3, 4]
结果应该是:
var result = [{
id: 1,
children: [{
id: 3
}]
}, {
id: 4,
children: []
}]
如何使用Lodash方法实现这一目标?
答案 0 :(得分:0)
您可以同时使用map
和filter
对嵌套元素应用过滤器,
_.map(data, elem => {
elem.children = _.filter(elem.children, child => selectedIds.includes(child.id));
return elem;
});
注意:假设过滤器必须仅应用于children
属性。
不要修改原始data
,
_.map(data, elem => {
let children = _.filter(elem.children, child => selectedIds.includes(child.id));
return Object.assign({}, elem, {children});
});
答案 1 :(得分:0)
您需要以递归方式遍历您的收藏(以及每个项目的子项)。我不相信lodash有一种本地实现方式。我编写了一个名为matcher
的函数,它接收集合和选定的id,并返回与这些id匹配的项,并传递子节点并执行相同的操作。我不知道如何处理没有选择父母而儿童是......的情况。我只是假设你把它们扔掉了。
重点是,你有一个非常特殊的结构(项目和子项是项目),需要你编写一个知道如何走这个结构的特定递归函数。
const matcher = (collection, selected) => _.reduce(collection, (result, item) => {
if (selected.includes(item.id)) {
result.push({
id: item.id,
children: matcher(item.children, selected)
})
}
return result
}, [])
const result = matcher(data, selectedIds)