3 回答

TA貢獻(xiàn)1921條經(jīng)驗(yàn) 獲得超9個(gè)贊
您不需要遞歸,只需要一個(gè)對(duì)象來(lái)保持對(duì)節(jié)點(diǎn)和父節(jié)點(diǎn)的引用。
這種方法也適用于未排序的數(shù)據(jù),因?yàn)樗瑫r(shí)使用了從項(xiàng)到父項(xiàng)和從父項(xiàng)到項(xiàng)的關(guān)系。
const
source = [{ id: 1, title: 'title1', alias: 'alias1', parent_id: null }, { id: 2, title: 'title2', alias: 'alias2', parent_id: null }, { id: 3, title: 'title3', alias: 'alias3', parent_id: 2 }, { id: 4, title: 'title4', alias: 'alias4', parent_id: 2 }, { id: 5, title: 'title5', alias: 'alias5', parent_id: 4 }, { id: 6, title: 'title6', alias: 'alias6', parent_id: 4 }],
tree = function (data, root) {
var t = {};
data.forEach(({ parent_id, ...o }) => {
Object.assign(t[o.id] = t[o.id] || {}, o);
t[parent_id] = t[parent_id] || {};
t[parent_id].items = t[parent_id].items || [];
t[parent_id].items.push(t[o.id]);
});
return t[root].items;
}(source, null);
console.log(tree);
.as-console-wrapper { max-height: 100% !important; top: 0; }

TA貢獻(xiàn)1757條經(jīng)驗(yàn) 獲得超7個(gè)贊
首先我正在嘗試一棵樹(shù),但在看到@nina-scholz答案之后。我決定以同樣的方式編寫(xiě)代碼ES6。
const source = [
{ id: 1, title: "title1", alias: "alias1", parent_id: null },
{ id: 2, title: "title2", alias: "alias2", parent_id: null },
{ id: 3, title: "title3", alias: "alias3", parent_id: 2 },
{ id: 4, title: "title4", alias: "alias4", parent_id: 2 },
{ id: 5, title: "title5", alias: "alias5", parent_id: 4 },
{ id: 6, title: "title6", alias: "alias6", parent_id: 4 }
];
const [result] = source.reduce(
([r, map], item) => {
const d = { ...item, children: [] };
const loc = map[item.parent_id];
if (loc) {
loc.children.push(d);
} else {
r.push(d);
}
map[item.id] = d;
return [r, map];
},
[[], {}]
);
console.log(JSON.stringify(result, null, 4));
.as-console-row {color: blue!important}

TA貢獻(xiàn)1757條經(jīng)驗(yàn) 獲得超8個(gè)贊
遍歷結(jié)果數(shù)組的每個(gè)對(duì)象。如果對(duì)象 id 與當(dāng)前對(duì)象的父 id 不匹配,則執(zhí)行遞歸調(diào)用以檢查其項(xiàng)目。
function findParentAndPushChild(object,resArray){
resArray.forEach( (child)=> {
if(child.id == object.parent_id)child.items.push(object);
else if(child.items.length!=0)findParentAndPushChild(object,child.items);
});
}
檢查以下代碼片段。
const source = [{ id: 1,title:'title1',alias:'alias1',parent_id: null},{id: 2,title:'title2',alias: 'alias2',parent_id: null},{id: 3,title:'title3',alias:'alias3',parent_id: 2},{ id: 4,title:'title4',alias:'alias4',parent_id: 2},{id: 5,title:'title5',alias:'alias5',parent_id: 4},{id: 6,title:'title6',alias:'alias6',parent_id: 4}
];
let resultArray=[];
source.map( obj =>{obj.items=[];return obj}).forEach(obj=>{
if(obj.parent_id==null)resultArray.push(obj);
else{
let index=resultArray.findIndex( (resObj)=>resObj.id==obj.parent_id);
if( index == -1)findParentAndPushChild(obj,resultArray)
else resultArray[index].items.push(obj);
}
})
function findParentAndPushChild(object,resArray){
resArray.forEach( (child)=> {if(child.id == object.parent_id)child.items.push(object);
else if(child.items.length!=0)findParentAndPushChild(object,child.items);
});
}
console.log(resultArray);
.as-console-wrapper { max-height: 100% !important; top: 0; }
添加回答
舉報(bào)