假设原始集合是:
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方法实现这一点?
发布于 2018-02-26 16:53:35
您可以同时使用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});
});发布于 2018-02-26 16:58:01
您需要递归地遍历您的集合(以及每个项目的子项)。我不相信lodash有一种原生的方式来实现这一点。我编写了一个名为matcher的函数,该函数接受集合和选定的I,并返回与这些I匹配的项,然后传入子对象并执行相同的操作。我不确定如何处理这样的情况,即父母没有被选中,但孩子被选中了……我以为你会把它们都扔掉。
重点是,您有一个非常特殊的结构(项和子项),它要求您编写一个知道如何遍历该结构的特定递归函数。
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)发布于 2018-02-26 16:54:30
您可以检查id,并只接受具有想要的id的孩子。
function getParts(array, ids) {
return array.reduce((r, { id, children }) =>
r.concat(ids.includes(id)
? { id, children: getParts(children || [], ids) }
: []
), []);
}
var data = [{ id: 1, children: [{ id: 2 }, { id: 3 }] }, { id: 4, children: [{ id: 5 }] }];
console.log(getParts(data, [1, 3, 4]));
console.log(getParts(data, [1, 3, 5]));.as-console-wrapper { max-height: 100% !important; top: 0; }
https://stackoverflow.com/questions/48984229
复制相似问题