js 实现 多层级对象合并

首先

需求是使用js对数据的格式进行转换 把一个二维数组(包含层级信息,层级数是不固定的)list 转换为多层级的对象

我的思路就是 循环先把list里单条信息转换为 多层级对象 然后和上一条 进行合并

原数据类型:

 [{
  id:a_a1_a2,
  value:1
 },{
  id:a_a2_a2,
  value:2
 },{
  id:b_b1,
  value:3
 }]

分别转换为:

 [a{
  a1{
  a2:1
  }
 }]
 [a{
  a2{
  a2:2
  }
 }]
 [b{
  b1:3
  }]

最终合并效果:

 {a{
  a1{
  a2:1
  },
  a2{
  a2:2
  }
  },
  b{
  b1:3
  }
  }

 

   
 onSubmit(): void {
 
     // 整理 item 数据
 
     let itemsListInfo = {};
 
  //this.addItemListData 存放的原始数据
     for (let i = 0; i < this.addItemListData.length; i++) {
 
       const itemTree = this.addItemListData[i].id.split('_');
 
       // 按照格式整理 当前item
       let thisItemInfo = {};
 
       for (let y = itemTree.length - 1; y >= 0; y--) {
 
         if (y === itemTree.length - 1) {
 
           thisItemInfo[itemTree[y]] = this.addItemListData[i].value;
 
        } else {
 
           // 如果直接赋值 会出现问题 需要使用另一个变量暂存
           const data = thisItemInfo;
           thisItemInfo = {};
           thisItemInfo[itemTree[y]] = data;
 
        }
 
      }
 
       console.log(thisItemInfo);
       // 合并当前item 到itemListInfo
 
       const itemTreeIndex = 0;
 
       itemsListInfo = this.margeItem(itemsListInfo, thisItemInfo, itemTree, itemTreeIndex, this.addItemListData[i]);
 
    }
 
  }
 
   margeItem(itemsListInfo: any, thisItemInfo: any, itemTree: any, itemTreeIndex: number, addItemListData: any): any {
 
     // 递归 判断是否存在相同层级
     // 直到 没有相同层级后 合并对象到上一级
     // 注意 如果是初次进入(没有上一级) 就直接赋值
 
     if (itemsListInfo.hasOwnProperty(itemTree[itemTreeIndex])) {
 
       itemsListInfo[itemTree[itemTreeIndex]]
         = this.margeItem(
           itemsListInfo[itemTree[itemTreeIndex]],
           thisItemInfo[itemTree[itemTreeIndex]],
           itemTree,
           itemTreeIndex + 1,
           addItemListData
        );
 
       return itemsListInfo;
    } else {
 
       let lastData = {};
 
       if (itemsListInfo.hasOwnProperty(itemTree[itemTreeIndex - 1])) {
 
         lastData = itemsListInfo[itemTree[itemTreeIndex - 1]];
         lastData[
版权声明:本文为nhxz001原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/nhxz001/p/12035588.html