背景:在前后端开发过程中,后端负责提供接口数据,有时前端需要把接口数据转成其他的格式,本文就用于将具备父子逻辑的行数据转成树形结构。
代码如下:
function rowDataToTreeData(rootTreeNode, rowData) {
if (rowData && rowData.length > 0) {
for (let i = 0; i < rowData.length; i++) {
//找出子节点
if (rootTreeNode.id === rowData[i].parentId) {
if (rootTreeNode.children) {
rootTreeNode.children.push(rowData.splice(i, 1)[0]);
} else {
rootTreeNode.children = [rowData.splice(i, 1)[0]];
}
i = i - 1;
}
}
if (rootTreeNode.children && rootTreeNode.children.length > 0) {
for (let i = 0; i < rootTreeNode.children.length; i++) {
rowDataToTreeData(rootTreeNode.children[i], rowData);//递归
}
}
}
return rootTreeNode;
}
let rootTreeNode = {//假设的根节点,便于递归逻辑
id: 0,
parentId: undefined,
children: []
};
let rowData = [
{
id: 1,
parentId: 0,
name: 1
},
{
id: 2,
parentId: 0,
name: 2
},
{
id: 3,
parentId: 1,
name: 3
},
{
id: 4,
parentId: 2,
name: 49
},
{
id: 5,
parentId: 3,
name: 5
},
{
id: 6,
parentId: 0,
name: 6
},
{
id: 7,
parentId: 6,
name: 7
},
{
id: 8,
parentId: 0,
name: 8
},
{
id: 9,
parentId: 4,
name: 9
},
{
id: 10,
parentId: 7,
name: 10
},
{
id: 11,
parentId: 10,
name: 11
},
{
id: 12,
parentId: 10,
name: 12
}
];
console.log(rowDataToTreeData(rootTreeNode,rowData));
备注:数据量很大的情况并没有测试,性能不能保证,如有道友参考需谨慎…