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就是我需要的最终格式

js 实现 多层级对象合并的更多相关文章

  1. js把两个对象合并成一个对象

    Object.assign() 方法用于将所有可枚举属性的值从一个或多个源对象复制到目标对象.它将返回目标对象 语法: Object.assign(target, ...sources)参数 targ ...

  2. js中数组和对象的合并

    1 数组合并 1.1 concat 方法 1 2 3 4 var a=[1,2,3],b=[4,5,6]; var c=a.concat(b); console.log(c);// 1,2,3,4,5 ...

  3. jQuery对象合并、jQuery添加静态方法、jQuery添加DOM实例方法

    实例效果: 代码演示: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http:/ ...

  4. js之数据类型(对象类型——构造器对象——数组2)

    一.数组空位与undefined 数组空位:数组的某一个位置没有任何值 产生空位的原因:数组中两个逗号之间不放任何值:用new Array()的方法,参数里是个数字:通过一个不存在的下标去增加数组:增 ...

  5. js中对Object对象的一些常用操作总结

    前言我前面的文章,写过js中“类”与继承的一些文章.ES5我们可以通过 构造函数 或者 Object.create()等方式来模拟出js中的“类”,当然,对象呢是类的实例化,我们可以通过如下方式创建对 ...

  6. JS入门之ActiveXObject对象(转载)

    JS入门之ActiveXObject对象   此对象提供自动化对象的接口.   function ActiveXObject(ProgID : String [, location : String] ...

  7. JS中的event 对象详解

    JS中的event 对象详解   JS的event对象 Event属性和方法:1. type:事件的类型,如onlick中的click:2. srcElement/target:事件源,就是发生事件的 ...

  8. js中两个对象的比较

    代码取自于underscore.js 1.8.3的isEqual函数. 做了一些小小的修改,主要是Function的比较修改. 自己也加了一些代码解读. <!DOCTYPE html> & ...

  9. MVC中处理Json和JS中处理Json对象

    MVC中处理Json和JS中处理Json对象 ASP.NET MVC 很好的封装了Json,本文介绍MVC中处理Json和JS中处理Json对象,并提供详细的示例代码供参考. MVC中已经很好的封装了 ...

随机推荐

  1. 关于数论分块里r=sum/(sum/l)的证明!

    今天的模拟赛里T2要使用到数论分块,里面有一个重要的坎就是关于r=sum/(sum/l)的证明,网上关于这道题的题解里都没有关于这个的证明,那么我就来填补一下: 在以下的文章里,我都会使用lo(x)表 ...

  2. IntelliJ IDEA自动部署项目至远程服务器与传统部署项目至远程服务器的区别

    每次开发Java项目时,对于所有Java开发人员来说,最枯燥的不是修改代码,而是实时将自己的代码上传至远程服务器,进行测试或者部署,本人最初开发也是这样,通过使用Xshell 5,WinSCP等工具对 ...

  3. cnblogs侧边栏访客统计 小插件

    之前博客的侧边栏一直用的是flagcounter,直观简洁又好看,近期恍然发现被博客园禁了.禁用原因据说是由于flagcounter将香港(HongKong).台湾(TaiWan)和澳门(Macau) ...

  4. 【北京/上海/南京】【部门直推】【可查询】【实习&社招】字节跳动数据平台前端内推

    [北京/上海/南京][部门直推][可查询][实习&社招]字节跳动数据平台前端内推 重要信息,写在前面  [投递邮箱]chengxinsong@bytedance.com [微信扫码] 2019 ...

  5. C语音中最简单的排序冒泡排序和选择排序代码实现(非指针)

    #include<stdio.h> int main() { int a[5] = { 2,5,7,3,-1 }; int n = sizeof(a) / sizeof(a[0]);//元 ...

  6. [内部类] java笔记之内部类

    1.内部类的分类 2.成员内部类的定义格式 3.一旦使用了内部类,那么生成的class文件长啥样? 其中Body是外部类,Heart是Body的内部类,所以中间有个美元符号$,所以给类进行命名时,不要 ...

  7. celery 启用worker ValueError: not enough values to unpack

    [2018-01-12 19:08:15,545: INFO/MainProcess] Received task: tasks.add[5d387722-5389-441b-9b01-a619b93 ...

  8. CSS(8)---通俗讲解定位(position)

    CSS(8)---通俗讲解定位(position) CSS有三种基本的定位机制: 普通流.浮动.定位.前面两个之前已经讲过,详见博客: 1.CSS(5)---通俗讲解盒子模型 2.CSS(6)---通 ...

  9. Apache Hudi 介绍与应用

    Apache Hudi Apache Hudi 在基于 HDFS/S3 数据存储之上,提供了两种流原语: 插入更新 增量拉取 一般来说,我们会将大量数据存储到HDFS/S3,新数据增量写入,而旧数据鲜 ...

  10. C语言|博客作业04

    这个作业属于哪个课程 C语言程序设计II 这个作业的要求在哪里 https://edu.cnblogs.com/campus/zswxy/CST2019-1/homework/9768 我在这个课程的 ...