2017-02-18 3 views
0

Dies sind die Beispieldaten (Array von MenuModel);Erstellen einer Liste mit rekursiver Funktion

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 von MenuModel:

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

-Code wird wie folgt

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); 
    } 
}); 

Es funktioniert für einen Schritt tief, aber kippe Ort "test-item7", weil seine Eltern (test- item6) ist auch Kind von "item1". also muss ich es rekursiv tun. Wie kann ich das erreichen?

Antwort

1

Da itemsConstructed keine Liste, sondern ein Baum ist, sollten Sie DFS verwenden.

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]; 
    } 
}); 

Mehr über DFS und Tree_traversal.

Verwandte Themen