【发布时间】:2022-11-15 08:25:50
【问题描述】:
我有一个看起来像这样的数组:
const arr = [
{
parent: 'A',
children: ['B'],
},
{
parent: 'B',
children: ['C'],
},
{
parent: 'C',
children: ['D']
}];
我想创建一个函数,它将接受这个数组并产生以下对象:
const result = {
parent: 'A',
children: [{
parent: 'B',
children: [{
parent: 'C',
children: [{
parent: 'D',
children: []
}]
}]
}]
};
所以结果类型看起来像:
type Result = {
parent: string;
children: Result[];
};
到目前为止我已经尝试过:
type TInput = {
parent: string;
children: string[];
};
type Result = {
parent: string;
children: Result[];
};
// can assume we know initial parent is 'A'
const fn = (parent: string, inputArr: TInput[]) => {
const result: TResult[] = [];
let newParent: string[] = [];
while (newParent.length !== 0) {
const index = inputArr.findIndex(
(input) => input.parent === parent
);
result.push({
parent: inputArr[index].parent,
children: [], // need to populate on next pass?
});
newParent = inputArr[index].children;
}
return result;
};
我不知道输入数组中有多少对象,但可以假设第一个对象已知是初始父/子(示例中为“A”)。非常感谢任何帮助。 谢谢
【问题讨论】:
-
这个条件应该做什么?
while (newParent.length !== 0)newParent一开始总是一个空数组 -
这回答了你的问题了吗? Build tree array from flat array in javascript
-
此外,您的结果树属性命名与平面数据冲突。
parent: 'A'应该表示该节点是A的子节点,但在您的树中,带有parent: 'B'的节点实际上是A的子节点 -
@PeterSeliger 我完全同意,这就是我在最初评论中所指的。它是可解的,但需要一个额外的循环来确定根节点(不是任何其他节点的子节点的节点)。
-
在我看来,所选择的源代码结构已经存在缺陷。就父子关系和每个子父关系而言,它不是双射/双唯一的。当一个人试图阅读和弄清楚转换后的目标结构的目的时,它会变得很明显。这两种结构都远非直观。源结构应该是……
const arr = [{ id: 'A', parentId: null }, { id: 'B', parentId: 'A' }, { id: 'C', parentId: 'B' }];……那么预期的结果就是……{ id: 'A', parentId: null, children: [{ id: 'B', parentId: 'A', children: [{ id: 'C', parentId: 'B' }] }] }。
标签: javascript node.js arrays nested-object