第一种方法: 使用for循环(性能比递归好很多,推荐使用)
// jsonData: 数组对象
// id: 每条数据的id
// pid: 每条数据的父节点对应字段
/*
[
{
name: '测试',
id: '1001',
pid: '-1',
}
]
*/
jsonToTree(jsonData, id, pid) {
let result = [],
temp = {}
for (let i = 0
temp[jsonData[i][id]] = jsonData[i]
}
for (let j = 0
let currentElement = jsonData[j]
let tempCurrentElementParent = temp[currentElement[pid]]
if (tempCurrentElementParent) {
// 如果存在父元素
if (!tempCurrentElementParent["children"]) {
// 如果父元素没有chindren键
tempCurrentElementParent["children"] = []
}
tempCurrentElementParent["children"].push(currentElement)
} else {
// 不存在父元素,意味着当前元素是一级元素
result.push(currentElement)
}
}
return result
}
第二种方法: 使用递归的方式:
translateDataToTree(data) {
const parent = data.filter(value => value.pid.trim() === '-1'
|| value.pid.trim() === null
|| value.pid.trim() === '');
const child = data.filter(value => value.pid.trim() !== '-1'
&& value.pid.trim() !== null
&& value.pid.trim() !== '');
const translator = (parents, children) => {
parents.forEach((item) => {
children.forEach((current, index) => {
if (current.pid === item.id) {
const temp = JSON.parse(JSON.stringify(children));
temp.splice(index, 1);
translator([current], temp);
if (typeof item.children !== 'undefined') {
item.children.push(current);
} else {
item.children = [current];
}
}
});
});
};
translator(parent, child);
return parent;
},