【问题标题】:Get first level, second level and third level child in Node JS在 Node JS 中获取第一级、第二级和第三级子级
【发布时间】:2021-08-24 12:40:59
【问题描述】:

我在 UI 端和对象列表中有一个下拉菜单。在这个列表中有很多子对象,我需要过滤所有这些子对象。请检查以下对象。我正在尝试通过 Node JS 来做。

 [
    {
        name : "This is horse",
        id:1
        parentId : null
    },
    {
        name : "horse child",
        id:2
        parentId : 1
    },
    {
        name : "horse child child",
        id:3
        parentId : 2
    },
    {
        name : "QQQQQ",
        id:4
        parentId : 1
    },
    {
        name : "WWWWWWWWWW",
        id:5
        parentId : 3
    },
    {
        name : "WWWWWWWWWW",
        id:6
        parentId : null
    }

]

如果我选择 0 级,那么我会得到 id: 1,6
如果我选择 1 级,那么我会得到 id: 1,2,4,6
如果我选择 2 级,那么我会得到 id: 1,2,3,4,5,6

【问题讨论】:

  • “我正在尝试使用 Node JS,但它不起作用。” - 请将此工作添加为基于文本的 minimal reproducible example
  • “级别”是什么意思?貌似是累积的?因为如果我要求所有 2 级项目,我希望只得到那些有祖父母的孩子,而不是他们的父母和祖父母自己。
  • @HereticMonkey,是的,你是对的,但我们需要所有这些。这就是为什么我也被卡住了
  • 所以显示你的卡在哪里。
  • 您可能会从Get all children from parent child JSON dataRecurvisely find children of children and remove 中找到灵感(只是不要删除任何内容)

标签: javascript node.js filter


【解决方案1】:

您应该对数据进行一些预处理,这样每个对象都会获得一个level 属性。一旦你有了它,过滤起来就是小菜一碟:

result = data.filter(o => o.level <= givenLevel);

使用树构建算法用level 填充您的数据。此代码还将为每个节点添加一个children 属性。也许有用:

function addLevels(data) {
    let map = new Map(data.map(o => [o.id, Object.assign(o, {children: []})])).set(null, {children: []});
    for (let o of data) map.get(o.parentId).children.push(o.id);
    (function dfs(id=null, level=-1) {
        const node = map.get(id);
        node.level = level;
        for (let child of node.children) dfs(child, level + 1);
    })();
}

// Example data
const data = [{ name : "This is horse", id:1, parentId : null }, { name : "horse child", id:2, parentId : 1 }, { name : "horse child child", id:3, parentId : 2 }, { name : "QQQQQ", id:4, parentId : 1 }, { name : "WWWWWWWWWW", id:5, parentId : 3 }, { name : "WWWWWWWWWW", id:6, parentId : null } ];

addLevels(data);

console.log(data);

您只需执行一次(或每次数据更改时),而不是每次您想要按级别过滤数据时。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-30
    • 2023-01-07
    • 1970-01-01
    • 2018-06-04
    • 1970-01-01
    • 2022-10-16
    • 2019-04-10
    • 2011-11-04
    相关资源
    最近更新 更多