首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于parentId的有序对象数组

基于parentId的有序对象数组
EN

Stack Overflow用户
提问于 2022-02-01 00:39:27
回答 1查看 346关注 0票数 0

我试图将数组中的每个元素所带来的parentId中的一个对象数组分组,总有一个不确定的级别,我希望得到的结果是输出中的一个。

我已经完成了第一个级别,它很好地创建了第一个chld子组,但是我不知道如何生成以下的子组。

输入

代码语言:javascript
复制
const data = [
{
    "groupid": 1,
    "parentid": 0,
    "usrdesc": "Principal"
},
{
    "groupid": 43,
    "parentid": 1,
    "usrdesc": "Opers"
},
{
    "groupid": 44,
    "parentid": 43,
    "usrdesc": "London"
},
{
    "groupid": 45,
    "parentid": 44,
    "usrdesc": "Sells"
},
{
    "groupid": 46,
    "parentid": 45,
    "usrdesc": "grp"
},
{
    "groupid": 89,
    "parentid": 46,
    "usrdesc": "PFG"
},
{
    "groupid": 48,
    "parentid": 44,
    "usrdesc": "WEF"
},
{
    "groupid": 49,
    "parentid": 44,
    "usrdesc": "API"
},
{
    "groupid": 50,
    "parentid": 49,
    "usrdesc": "CTX"
},
{
    "groupid": 142,
    "parentid": 44,
    "usrdesc": "CSS"
},
{
    "groupid": 58,
    "parentid": 1,
    "usrdesc": "ASD"
},
{
    "groupid": 71,
    "parentid": 58,
    "usrdesc": "CZX"
},
{
    "groupid": 106,
    "parentid": 58,
    "usrdesc": "RTE"
},
{
    "groupid": 140,
    "parentid": 58,
    "usrdesc": "NIO"
},
{
    "groupid": 148,
    "parentid": 58,
    "usrdesc": "ADGB"
},
{
    "groupid": 62,
    "parentid": 1,
    "usrdesc": "OUS"
},
{
    "groupid": 136,
    "parentid": 1,
    "usrdesc": "BGE"
},
{
    "groupid": 137,
    "parentid": 136,
    "usrdesc": "PDS"
},
{
    "groupid": 138,
    "parentid": 136,
    "usrdesc": "DVE"
}
]

输出

代码语言:javascript
复制
const response = [
{
    "groupid": 1,
    "parentid": 0,
    "usrdesc": "Principal",
    "chlds": [
        {
            "groupid": 43,
            "parentid": 1,
            "usrdesc": "Opers",
            "chlds": [
                {
                    "groupid": 44,
                    "parentid": 43,
                    "usrdesc": "London",
                    "chlds": [
                        {
                            "groupid": 45,
                            "parentid": 44,
                            "usrdesc": "Sells",
                            "chlds": [
                                {
                                    "groupid": 46,
                                    "parentid": 45,
                                    "usrdesc": "grp",
                                    "chlds": [
                                        {
                                            "groupid": 89,
                                            "parentid": 46,
                                            "usrdesc": "PFG"
                                        }
                                    ]
                                }
                            ]
                        },
                        {
                            "groupid": 48,
                            "parentid": 44,
                            "usrdesc": "WEF"
                        },
                        {
                            "groupid": 49,
                            "parentid": 44,
                            "usrdesc": "API",
                            "chlds": [
                                {
                                    "groupid": 50,
                                    "parentid": 49,
                                    "usrdesc": "CTX"
                                }
                            ]
                        },
                        {
                            "groupid": 142,
                            "parentid": 44,
                            "usrdesc": "CSS"
                        }
                    ]
                }
            ]
        },
        {
            "groupid": 58,
            "parentid": 1,
            "usrdesc": "ASD",
            "chlds": [
                {
                    "groupid": 71,
                    "parentid": 58,
                    "usrdesc": "CZX"
                },
                {
                    "groupid": 106,
                    "parentid": 58,
                    "usrdesc": "RTE"
                },
                {
                    "groupid": 140,
                    "parentid": 58,
                    "usrdesc": "NIO"
                },
                {
                    "groupid": 148,
                    "parentid": 58,
                    "usrdesc": "ADGB"
                }
            ]
        },
        {
            "groupid": 62,
            "parentid": 1,
            "usrdesc": "OUS"
        },
        {
            "groupid": 136,
            "parentid": 1,
            "usrdesc": "BGE",
            "chlds": [
                {
                    "groupid": 137,
                    "parentid": 136,
                    "usrdesc": "PDS"
                },
                {
                    "groupid": 138,
                    "parentid": 136,
                    "usrdesc": "DVE"
                }
            ]
        }
    ]
}
]

这是我的密码

代码语言:javascript
复制
const nested = data.reduce((acc, item) => {
if (item.parentid === 0) {
  return [...acc, item];
} else {
  const parentIndex = acc.findIndex(parent => parent.groupid === item.parentid);
  const parent = acc[parentIndex];
  if (parentIndex >= 0) {
    const children = parent.children ?? [];
    return Object.assign([], acc, {
      [parentIndex]: {
        ...parent,
        children: [...children, item],
      },
    });
  }
  return acc
}
  }, []);
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-02-01 13:01:36

对于这个递归问题,我倾向于不使用嵌套的reduce,而是执行以下操作:

代码语言:javascript
复制
function attachChildren (item, data) {
  const children = data
    .filter(d => d.parentid === item.groupid)
    .map(d => attachChildren(d, data))

  return children.length ? { ...item, children } : item
}

console.dir(attachChildren(data[0], data), { depth: null })

注意:我在代码片段中使用了children,因此您可能需要调整它,以便在输出中使用chlds

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

https://stackoverflow.com/questions/70934471

复制
相关文章

相似问题

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