我正在开发一个 JavaScript 工具,旨在简化大型树状数据结构的创建。该概念涉及定义层次结构并指定每个嵌套级别内的项目数量。随后,我的目标是让 JavaScript 生成一个表示该层次结构的数组。期望的结果是获得一个扁平的项目列表,每个项目都有一个关联的parentId来表示它们在层次结构中的位置。如何在 JavaScript 中有效地实现这一点?
输入
[{
id: "123",
parentId: null,
name: "ep101",
seq: ["ep101", "ep102"]
}, {
id: "234",
parentId: "123",
name: "ep101sh010",
seq: ["ep101sh010", "ep101sh020"]
}, {
id: "345",
parentId: "234",
name: "Generic",
seq: []
}];
输出
[{
id: "123",
parentId: null,
name: "ep101"
}, {
id: "234",
parentId: "123",
name: "ep101sh010"
}, {
id: "345",
parentId: "234",
name: "Generic"
}, {
id: "235",
parentId: "123",
name: "ep101sh020"
}, {
id: "346",
parentId: "235",
name: "Generic"
}, {
id: "124",
parentId: null,
name: "ep102"
}, {
id: "244",
parentId: "124",
name: "ep102sh010"
}, {
id: "355",
parentId: "244",
name: "Generic"
}, {
id: "245",
parentId: "124",
name: "ep102sh020"
}, {
id: "356",
parentId: "245",
name: "Generic"
}];
目标是创建一个具有父子关系的树结构,并将其扁平化为具有 id、parentId 和 name 属性的项目。
在输入字符串中,您有一个具有类似模板格式的初始结构,其中每个对象都有一个 id、parentId、name 和 seq 属性。 seq 属性似乎表示子节点的序列。 输出似乎是该结构的扁平化版本,其中所有子节点都展开,并且每个节点都有唯一的 ID、parentId 和名称。
下面的代码将帮助您实现输出:
function flattenHierarchy(input) {
const output = [];
const stack = [...input];
let counter = 0;
while (stack.length > 0) {
const node = stack.pop();
const newNode = {
id: node.id,
parentId: node.parentId,
name: node.name
};
output.push(newNode);
if (node.seq && Array.isArray(node.seq)) {
for (let i = node.seq.length - 1; i >= 0; i--) {
const childName = node.seq[i];
const childNode = {
id: (++counter).toString(),
parentId: newNode.id,
name: childName
};
output.push(childNode);
stack.push(childNode);
}
}
}
return output;
}
const input = [{
id: "123",
parentId: null,
name: "ep101",
seq: ["ep101", "ep102"]
}, {
id: "234",
parentId: "123",
name: "ep101sh010",
seq: ["ep101sh010", "ep101sh020"]
}, {
id: "345",
parentId: "234",
name: "Generic",
seq: []
}];
const output = flattenHierarchy(input);
console.log(output);