// 原理: 先给根节点找子,再给子找子,一次类推(某个节点一直找到尽头才开启下一个节点) 好比: 根节点是:爷爷 子节点有:叔叔1, 叔叔2 方法:先找爷爷的子节点,即叔叔1和叔叔2,可是在找叔叔2前,先把叔叔1的整个家族找全了,再去找叔叔2的家族。 示例: let allList = [ { id: 1, pid: 0, name: '老祖宗' }, { id: 2, pid: 1, name: '爷爷1' }, { id: 3, pid: 1, name: '爷爷2' }, { id: 4, pid: 2, name: '爸爸1' }, { id: 5, pid: 3, name: '爸爸2' }, { id: 6, pid: 5, name: '儿子' } ]; // 获取根节点 let root = allList.find(item => item.pid === 0); console.log('根节点', root) function toTree (obj) { // 给该节点建立一个children属性 obj.children = []; allList.forEach(item => { // 给该节点找"直接"的子级 if (item.pid === obj.id) { obj.children.push(item); // 给该节点再找"直接"的子级(找全该节点的家族) toTree(item) }; }); return obj; } console.log('输出', toTree(root))