js 实现 多层级对象合并

软件发布|下载排行|最新软件

当前位置:首页IT学院IT技术

js 实现 多层级对象合并

难绘小妹   2019-12-14 我要评论

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[itemTree[itemTreeIndex]] = thisItemInfo[itemTree[itemTreeIndex]];
 ​
      } else {
 ​
         lastData = thisItemInfo[itemTree[itemTreeIndex]];
      }
 ​
       itemsListInfo[itemTree[itemTreeIndex]] = lastData;
       return itemsListInfo;
 ​
    }
 ​
  }

 

最后itemsListInfo就是我需要的最终格式

Copyright 2022 版权所有 软件发布 访问手机版

声明:所有软件和文章来自软件开发商或者作者 如有异议 请与本站联系 联系我们