Lodash - 按prop值数组过滤嵌套集合

时间:2018-02-26 08:28:59

标签: javascript underscore.js lodash

说原始集合是:

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方法实现这一目标?

2 个答案:

答案 0 :(得分:0)

您可以同时使用mapfilter对嵌套元素应用过滤器,

_.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)
相关问题