请教各位大lao
怎么将上面这种数据格式转成下面这种格式啊,tree结构
该回答引用GPTᴼᴾᴱᴺᴬᴵ
如果您的 pid 字段是无效的,那么可以使用以下方法将原始数据格式转换成树形结构:
function buildTree(data) {
let map = {}, node, roots = [], i;
for (i = 0; i < data.length; i += 1) {
map[data[i].id] = i;
data[i].children = [];
}
for (i = 0; i < data.length; i += 1) {
node = data[i];
if (node.pid !== 0) {
data[map[node.pid]].children.push(node);
} else {
roots.push(node);
}
}
return roots;
}
这个函数遍历输入数据数组两次。第一次遍历创建一个哈希表 map,它的键是每个节点的 id 值,值是该节点在数组中的索引。同时在每个节点上添加一个空数组 children,以便在第二次遍历时将它们添加为父节点的子节点。第二次遍历遍历数据数组,并将每个节点添加到它的父节点的 children 数组中,或者添加到根节点数组 roots 中,如果节点没有父节点。
调用这个函数可以将原始数据转换成树形结构:
let data = [
{ id: 1, name: 'Node 1', pid: 0 },
{ id: 2, name: 'Node 2', pid: 1 },
{ id: 3, name: 'Node 3', pid: 2 },
{ id: 4, name: 'Node 4', pid: 0 },
{ id: 5, name: 'Node 5', pid: 4 },
{ id: 6, name: 'Node 6', pid: 5 }
];
let tree = buildTree(data);
console.log(tree);
这将输出以下树形结构:
[ { "id": 1, "name": "Node 1", "pid": 0, "children": [ { "id": 2, "name": "Node 2", "pid": 1, "children": [ { "id": 3, "name": "Node 3", "pid": 2, "children": []
}
]
}
]
},
{
"id": 4,
"name": "Node 4",
"pid": 0,
"children": [
{
"id": 5,
"name": "Node 5",
"pid": 4,
"children": [
{
"id": 6,
"name": "Node 6",
"pid": 5,
"children": []
}
]
}
]
}
]