동일한 배열에 일대다 관계가 있는 데이터가 있습니다. 조직은 수준별로 설정됩니다. 요소의 부모는 항상 자신보다 한 수준 높으며 parentId에 의해 참조됩니다.
이 배열에서 다중 레벨 배열을 가져와야 합니다. 가장 높은 수준을 가진 요소는 하위 배열로 자식을 포함하는 기본 배열이 됩니다.
입력 배열이 -
로 주어지면const arr = [ { _id: 100, level: 3, parentId: null, }, { _id: 101, level: 2, parentId: 100, }, { _id: 102, level: 2, parentId: 100, }, { _id: 103, level: 2, parentId: 100, }, { _id: 104, level: 1, parentId: 101, }, { _id: 105, level: 1, parentId: 102, }, { _id: 106, level: 1, parentId: 101, }, { _id: 107, level: 1, parentId: 103, }, { _id: 108, level: 1, parentId: 102, }, { _id: 109, level: 1, parentId: 103, } ];
그러면 출력 구조는 다음과 같아야 합니다. -
100 | ------------------------------------ | | | 101 102 103 ------- ------ ------ | | | | | | 104 106 105 108 107 109
예시
이에 대한 코드는 -
const arr = [{ _id: 100, level: 3, parentId: null, }, { _id: 101, level: 2, parentId: 100, }, { _id: 102, level: 2, parentId: 100, }, { _id: 103, level: 2, parentId: 100, }, { _id: 104, level: 1, parentId: 101, }, { _id: 105, level: 1, parentId: 102, }, { _id: 106, level: 1, parentId: 101, }, { _id: 107, level: 1, parentId: 103, }, { _id: 108, level: 1, parentId: 102, }, { _id: 109, level: 1, parentId: 103, }]; const prepareTree = (arr = [], root = null) => { let res; const obj = Object.create(null); arr.forEach(el => { el.children = obj[el._id] && obj[el._id].children; obj[el._id] = el; if (el.parentId === root) { res = el; } else { obj[el.parentId] = obj[el.parentId] || {}; obj[el.parentId].children = obj[el.parentId].children || []; obj[el.parentId].children.push(el); } }); return res; }; console.log(JSON.stringify(prepareTree(arr), undefined, 4));
출력
콘솔의 출력은 -
{ "_id": 100, "level": 3, "parentId": null, "children": [ { "_id": 101, "level": 2, "parentId": 100, "children": [ { "_id": 104, "level": 1, "parentId": 101 }, { "_id": 106, "level": 1, "parentId": 101 } ] }, { "_id": 102, "level": 2, "parentId": 100, "children": [ { "_id": 105, "level": 1, "parentId": 102 }, { "_id": 108, "level": 1, "parentId": 102 } ] }, { "_id": 103, "level": 2, "parentId": 100, "children": [ { "_id": 107, "level": 1, "parentId": 103 }, { "_id": 109, "level": 1, "parentId": 103 } ] } ] }