【问题标题】:How to create list with recursive function如何使用递归函数创建列表
【发布时间】:2017-07-08 09:23:58
【问题描述】:

这是示例数据(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}
];

MenuModel的定义:

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

它可以深入一步,但不能放置“test-item7”,因为它的父项(test-item6)也是“item1”的子项。所以我需要递归地做。我怎样才能做到这一点?

【问题讨论】:

    标签: jquery angularjs recursion typescript


    【解决方案1】:

    由于itemsConstructed 不是列表而是树,所以应该使用 DFS。

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

    更多关于DFSTree_traversal的信息。

    【讨论】:

      猜你喜欢
      • 2020-11-01
      • 1970-01-01
      • 2020-02-16
      • 1970-01-01
      • 1970-01-01
      • 2013-08-27
      • 1970-01-01
      • 2021-04-18
      • 2021-12-11
      相关资源
      最近更新 更多