按 parentId 排序对象数组
Order Array of objects by parentId
我正在尝试从数组的每个元素带来的 parentId 中对一组对象进行分组,总是会有不确定数量的级别,我期望的结果是我在输出中得到的结果。
我已经完成了第一个级别,它很好地创建了第一个 chlds 子组,但我不知道如何生成以下子组。
输入
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"
}
]
输出
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"
}
]
}
]
}
]
这是我的代码
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
}
}, []);
对于这个递归问题,我倾向于不去理会嵌套 reduce
而是做类似的事情:
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
。
我正在尝试从数组的每个元素带来的 parentId 中对一组对象进行分组,总是会有不确定数量的级别,我期望的结果是我在输出中得到的结果。
我已经完成了第一个级别,它很好地创建了第一个 chlds 子组,但我不知道如何生成以下子组。
输入
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"
}
]
输出
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"
}
]
}
]
}
]
这是我的代码
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
}
}, []);
对于这个递归问题,我倾向于不去理会嵌套 reduce
而是做类似的事情:
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
。