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. Cauchy-Binet公式的证明 及 对Denton et al. (2019)的个人注(1)

    ------------恢复内容开始------------ 据新闻报道数学天才陶哲轩和3个物理学家研究出一个只用特征值就可以计算矩阵特征向量的公式, 我感觉很有趣, 这应该能够应用在很多领域中, 所 ...

  2. MBR分区表的备份与还原

    MBR分区表的备份与还原 MBR分区的存储 从下图可以看出,MBR分区前446字节是boot loader:接下来64字节是分区表:再然后就是三个主分区加一个拓展分区. 一.备份分区表,要跳过前446 ...

  3. ThinkPHP 6.0 管道模式与中间件的实现分析

    设计模式六大原则 开放封闭原则:一个软件实体如类.模块和函数应该对扩展开放,对修改关闭. 里氏替换原则:所有引用基类的地方必须能透明地使用其子类的对象. 依赖倒置原则:高层模块不应该依赖低层模块,二者 ...

  4. pat 1006 Sign In and Sign Out(25 分)

    1006 Sign In and Sign Out(25 分) At the beginning of every day, the first person who signs in the com ...

  5. NetCore基于EasyNetQ的高级API使用RabbitMq

    一.消息队列 消息队列作为分布式系统中的重要组件,常用的有MSMQ,RabbitMq,Kafa,ActiveMQ,RocketMQ.至于各种消息队列的优缺点比较,在这里就不做扩展了,网上资源很多. 更 ...

  6. 【前端知识体系-CSS相关】CSS预处理器

    1.常见的CSS预处理器有哪些? [!NOTE] css预处理器:用一种专门的编程语言,为CSS增加了一些编程的特性,将CSS作为目标生成文件,然后开发者就只要使用这种语言进行编码工作,可以让你的CS ...

  7. linux文件时间

    Linux 查看文件修改时间(精确到秒)(简单) ls --full-time 查看文件时间戳命令:stat test.txt linux 下查看文件修改时间 等(详细) 查看文件时间戳命令:stat ...

  8. PL真有意思(一):引言

    前言 断断续续学编译原理到之前发过写一个编译器和正则表达式引擎系列文章也有一段时间了,然后最近看完PLP这本书,这本书应该算是入门书,但是对我这种半吊子收获很大.所以为了弥补最近学操作系统和接外包摸的 ...

  9. NIO流的学习以及Buffer的相关操作

    NIO的使用 一).什么叫NIO? 定义:是一套新的Java I/O标准, 在java1.4中被纳入JDK中. 二).NIO的实现方法 NIO是基于块的, 以块为基本单位处理数据. 标准的I/O是基于 ...

  10. K8s & Openshift案例学习

    1. openshift排错技巧:https://mp.weixin.qq.com/s?__biz=MzAwMDc2NjQ4Nw==&mid=2663494178&idx=1& ...