突然觉得好像挺常用的,记下来方便以后抄。
初始数组:
const list = [ { id: "1", pid: "" }, { id: "2", pid: "1" }, { id: "3", pid: "1" }, { id: "4", pid: "2" }, { id: "5", pid: "3" }, ];
最终结构:
[ { "id": "1", "pid": "", "second": [ { "id": "2", "pid": "1", "second": [ { "id": "4", "pid": "2" } ] }, { "id": "3", "pid": "1", "second": [ { "id": "5", "pid": "3" } ] } ] } ]
方法:
concatList(data) { const newObj = {}; data.forEach((item) => { newObj[item.id] = item; }); const newData = []; data.forEach((item) => { const parentObj = newObj[item.pid]; if (parentObj) { parentObj.second = [...(parentObj.second || []), item]; } else { newData.push(item); } }); return newData; }
思路:
把初始数组全部放到一个对象中,用id做key值,对象内容就是其value;
然后遍历初始数组的数据,如果数据的pid在对象里能找到对应的key,就说明他的pid=这个id,就塞到那个数据的second(可以理解为children)里;
如果这个数据没有在对象里找到对应的key,就说明他自己是一个父节点,直接塞入新数组里。