2017-02-18 10 views
0

これはサンプルデータ(MenuModelの配列)です。 MenuModelの再帰関数を使用してリストを作成する方法

this.menuItems = [ 
    {Id:1, itemName:'test-item1'}, 
    {Id:2, itemName:'test-item2'}, 
    {Id:3, itemName:'test-item3'}, 
    {Id:4, itemName:'test-item4',parentId:1}, 
    {Id:5, itemName:'test-item5',parentId:2}, 
    {Id:6, itemName:'test-item6',parentId:1}, 
    {Id:7, itemName:'test-item7',parentId:6} 
]; 

Defination:

export interface IMenuModel{ 
    Id:number 
    itemName:string; 
    parentId?:number; 
    childItems?:IMenuModel[]; 
} 

コードは以下のとおりである

var tempItems = this.menuItems; 
var itemsConstructed: IMenuModel[] = []; 
tempItems.map((item: IMenuModel, i: number) => { 
    var newItem: IMenuModel = { Id: item.Id, itemName: item.itemName, parentId: item.parentId, childItems: [] }; 
    var isInList: boolean = false; 
    itemsConstructed.map((item_: IMenuModel) => { 
     if (item_.Id == newItem.parentId) { 
      item_.childItems ? item_.childItems.push(newItem) : [newItem]; 
      isInList = true; 
     } 
    }); 

    if (!isInList) { 
     itemsConstructed.push(newItem); 
    } 
}); 

それは一歩深いのために動作しますが、カントの場所 "テストitem7"、その親(試験 - item6)も "item1"の子です。私は再帰的にそれを行う必要があります。どうすればこれを達成できますか?

答えて

1

itemsConstructedはリストではなくツリーですので、DFSを使用する必要があります。 DFSTree_traversalについて

function search(items:IMenuModel[],id:number):IMenuModel{ 
    for(let i=0; i<items.length; i++){ 
    if(items[i].Id==id){ 
     return items[i]; 
    }else{ 
     if(items[i].childItems && items[i].childItems.lenght>0){ 
     let temp = search(items[i].childItems, id); 
     if(temp==null){ 
      continue; 
     }else{ 
      return temp; 
     } 
     } 
    } 
    } 
    return null; 
} 

var tempItems = this.menuItems; 
var itemsConstructed: IMenuModel[]=[]; 
tempItems.map((item:IMenuModel, i:number)=>{ 
    var newItem:IMenuModel={ Id:item.Id, itemName:item.itemName, parentId:item.parentId, childItems:[] }; 
    var isInList:boolean = false; 
    if(newItem.parentId==null){//doesn't have parentId 
     itemsConstructed.push(newItem); 
     return; 
    } 
    var parentItem=search(itemsConstructed,item.parentId); 
    if(parentItem==null){//doesn't exist 
     itemsConstructed.push(newItem); 
    }else{//exist in list 
     item_.childItems?item_.childItems.push(newItem):[newItem]; 
    } 
}); 

より。

関連する問題