1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
| function toTree(arr){ const idMap = {}; const childMap = {}; arr.forEach((item)=> { idMap[item.id] = item; if (item.parentId) { childMap[item.parentId] = childMap[item.parentId] || []; childMap[item.parentId].push(item); } }) arr.forEach((item)=> { if (item.parentId) { idMap[item.parentId].children = childMap[item.parentId]; } })
return arr.filter(item => item.parentId === null); } const arr = [ { id: 5, name: 'node 5', parentId: null }, { id: 4, name: 'node 4', parentId: 2 }, { id: 3, name: 'node 3', parentId: 4 }, { id: 2, name: 'node 2', parentId: 5 }, { id: 1, name: 'node 1', parentId: null } ]; console.log(JSON.stringify(toTree(arr), null, 2));
[ { "id": 5, "name": "node 5", "parentId": null, "children": [ { "id": 2, "name": "node 2", "parentId": 5, "children": [ { "id": 4, "name": "node 4", "parentId": 2, "children": [ { "id": 3, "name": "node 3", "parentId": 4 } ] } ] } ] }, { "id": 1, "name": "node 1", "parentId": null } ]
|