【发布时间】:2021-11-10 09:30:19
【问题描述】:
我有一个递归对象的结构:
const obj = {
name: 'entity-0',
children: [{
name: 'entity-0-0',
children: []
}, {
name: 'entity-0-1',
children: [{
name: 'entity-1-0',
children: []
}]
}]
}
我目前正在将其转换为这样的平面数组:
const arr = [];
function convertObjToArr(obj, level, parent) {
arr.push({ name: obj.name, parent: parent?.name, level });
obj.children.forEach(v => this.convertObjToArr(v, level + 1, obj));
}
convertObjToArr(obj, 0);
这导致数组看起来像这样:
[
{ name: 'entity-0', level: 0 },
{ name: 'entity-0-0', parent: 'entity-0', level: 1 },
{ name: 'entity-0-1', parent: 'entity-0', level: 1 },
{ name: 'entity-1-0', parent: 'entity-0-1', level: 2}
]
我现在需要做的是扭转这个过程。我将生成的arr 作为输入并得到obj 作为输出。这可能吗?我该怎么做?
据我所知:
function convertArrToObj(iArr) {
for(let i = 0; i < iArr.length; i++) {
if(!iArr[i].parent) newObj = { ...iArr[i], children: [] };
else {
// this should somehow find iArr[i].parent and insert itself into its children array
}
}
}
但是正如你所看到的,它是不完整的,我很确定它不会是递归的,所以如果它的深度超过 1 层,它将无法工作,我不认为。
【问题讨论】:
-
this should somehow find iArr[i].parent你的意思是像if (newObj[iArr[i].parent])?您只是在问如何根据存储在变量中的键访问对象的子对象吗? -
请注意,您的中间格式无法轻易区分一棵树和一棵树的森林,因此这里的答案——以及至少一些来自重复的答案——都包含一个额外的数组包装器。如果你知道你的树是单根树,你可以简单地从结果中取出第一个元素。
标签: javascript arrays object recursion