从对象的平面阵列创建对象的嵌套阵列(最多5个级别)



我需要从平面对象数组创建一个嵌套的对象数组,该数组最多有5个级别。原始JSON如下所示:

[{
"code": "01",
"name": "Some name 1",
"level": "1"
}, {
"code": "01.1",
"name": "Some name 2",
"level": "2"
}, {
"code": "01.11",
"name": "Some name 3",
"level": "3"
}, {
"code": "01.11.1",
"name": "Some name 4",
"level": "4"
}, {
"code": "01.11.11",
"name": "Some name 5",
"level": "5"
}, {
"code": "01.11.12",
"name": "Some name 6",
"level": "5"
}]

新数组将用于Ant设计树组件,因此它应该具有以下结构:

[
{
key: '01',
title: 'Some name 1',
children: [
key: '01.1'
title: 'Some name 2',
children: [
{
key: '01.11'
title: 'Some name 3',
children: [
{
key: '01.11.1'
title: 'Some name 4',
children: [
{
key: '01.11.11'
title: 'Some name 5'
},
{
key: '01.11.12'
title: 'Some name 6'
}
]
}
]
}
]
]
}
]

我已经创建了一个用于嵌套数组的函数,但组件变得非常慢。我想还有更好的方法。这是我的代码:

const __getCodes = () => {
let array = codeData;
let result = [];
for(let i = 0; i < array.length; i++) {
let obj = array[i];
if (obj.level === "1") {
result.push({key: obj.code, title: obj.code + ' ' + obj.name, checkable: false});
}
if (obj.level === "2") {
const currentGroup = result.find(group => group.key === obj.code.substring(0,2))
if (!currentGroup.children) {
currentGroup.children = []
}
currentGroup.children.push({key: obj.code, title: obj.code + ' ' + obj.name, checkable: false})
}
if (obj.level === "3") {
const parentGroup = result.find(group => group.key === obj.code.substring(0,2))
const currentGroup = parentGroup.children.find(group => group.key === obj.code.substring(0,4))
if (!currentGroup.children) {
currentGroup.children = []
}
currentGroup.children.push({key: obj.code, title: obj.code + ' ' + obj.name})
}
if (obj.level === "4") {
const subParentGroup = result.find(group => group.key === obj.code.substring(0,2))
const parentGroup = subParentGroup.children.find(group => group.key === obj.code.substring(0,4))
const currentGroup = parentGroup.children.find(group => group.key === obj.code.substring(0,5))
if (!currentGroup.children) {
currentGroup.children = []
}
currentGroup.children.push({key: obj.code, title: obj.code + ' ' + obj.name})
}
if (obj.level === "5") {
const subSubParentGroup = result.find(group => group.key === obj.code.substring(0,2))
const subParentGroup = subSubParentGroup.children.find(group => group.key === obj.code.substring(0,4))
const parentGroup = subParentGroup.children.find(group => group.key === obj.code.substring(0,5))
const currentGroup = parentGroup.children.find(group => group.key === obj.code.substring(0,7))
if (!currentGroup.children) {
currentGroup.children = []
}
currentGroup.children.push({key: obj.code, title: obj.code + ' ' + obj.name})
}
}
return result;
}
const treeData = __getCodes();

如何优化此函数以获得所需的结果?

您可以创建一个解决方案,该解决方案将使用level属性在嵌套结构中的某个级别推送当前对象,并将其与引用和reduce方法相结合。

const data = [{"code":"01","name":"Some name 1","level":"1"},{"code":"01.1","name":"Some name 2","level":"2"},{"code":"01.11","name":"Some name 3","level":"3"},{"code":"01.11.1","name":"Some name 4","level":"4"},{"code":"01.11.11","name":"Some name 5","level":"5"},{"code":"01.11.12","name":"Some name 6","level":"5"}]
const result = data.reduce((r, { level, ...rest }) => {
const value = { ...rest, children: [] }
r[level] = value.children;
r[level - 1].push(value)
return r;
}, [[]]).shift()
console.log(result)

最新更新