首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Lodash -按属性值数组过滤嵌套集合

问Lodash -按属性值数组过滤嵌套集合
EN

Stack Overflow用户
提问于 2018-02-26 16:28:59
回答 3查看 2.5K关注 0票数 0

假设原始集合是:

代码语言:javascript
复制
var data = [{
  id: 1,
  children: [{
    id: 2
  }, {
    id: 3
  }]
}, {
  id: 4,
  children: [{
    id: 5
  }]
}]

我想用这个给定的id属性值对其进行过滤:

代码语言:javascript
复制
var selectedIds = [1, 3, 4]

结果应该是:

代码语言:javascript
复制
var result = [{
  id: 1,
  children: [{
    id: 3
  }]
}, {
  id: 4,
  children: []
}]

如何使用Lodash方法实现这一点?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-02-26 16:53:35

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

代码语言:javascript
复制
_.map(data, elem => {
    elem.children = _.filter(elem.children, child => selectedIds.includes(child.id));
    return elem;
});

注意:假设过滤器只能应用于children属性。

为了不修改原始data,

代码语言:javascript
复制
_.map(data, elem => {
    let children = _.filter(elem.children, child => selectedIds.includes(child.id));
    return Object.assign({}, elem, {children});
});
票数 1
EN

Stack Overflow用户

发布于 2018-02-26 16:58:01

您需要递归地遍历您的集合(以及每个项目的子项)。我不相信lodash有一种原生的方式来实现这一点。我编写了一个名为matcher的函数,该函数接受集合和选定的I,并返回与这些I匹配的项,然后传入子对象并执行相同的操作。我不确定如何处理这样的情况,即父母没有被选中,但孩子被选中了……我以为你会把它们都扔掉。

重点是,您有一个非常特殊的结构(项和子项),它要求您编写一个知道如何遍历该结构的特定递归函数。

代码语言:javascript
复制
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)
票数 1
EN

Stack Overflow用户

发布于 2018-02-26 16:54:30

您可以检查id,并只接受具有想要的id的孩子。

​

代码语言:javascript
复制
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]));
代码语言:javascript
复制
.as-console-wrapper { max-height: 100% !important; top: 0; }

​

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48984229

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档