data = [
{id: 1, parent_id: 0, name: "A"},
{id: 2, parent_id: 1, name: "AA"},
{id: 3, parent_id: 1, name: "AB"},
{id: 4, parent_id: 3, name: "ABA"},
{id: 5, parent_id: 3, name: "ABB"},
{id: 6, parent_id: 3, name: "ABC"},
{id: 7, parent_id: 1, name: "AC"},
{id: 8, parent_id: 7, name: "ACA"},
{id: 9, parent_id: 8, name: "ACAA"},
{id: 10, parent_id: 8, name: "ACAB"},
]
function list_to_tree(data) {
/**
* @data: 由id和parent_id组成的树形结构二维数据, 元数据中id必须大于0
*/
res = {};
for (let i = 0; i < data.length; i++) {
row = data[i];
// 此行代码用以统一根节点的paren_id, 跟节点的parent_id 可以为 0 或 null
row.parent_id = row.parent_id ? row.parent_id : 0
if (res[row.id]) {
Object.assign(res[row.id], {id: row.id, text: row.name});
} else {
res[row.id] = {id: row.id, text: row.name, children: []};
}
if (res[row.parent_id]) {
res[row.parent_id].children.push(res[row.id]);
} else {
res[row.parent_id] = {children: [res[row.id]]};
}
}
return res[0].children
}
const nest = (items, id = null, link = 'parent_id') =>
items
.filter(item => item[link] === id)
.map(item => ({ ...item, children: nest(items, item.id) }));