js 实现 多层级对象合并
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 实现 多层级对象合并的更多相关文章
- js把两个对象合并成一个对象
Object.assign() 方法用于将所有可枚举属性的值从一个或多个源对象复制到目标对象.它将返回目标对象 语法: Object.assign(target, ...sources)参数 targ ...
- 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 ...
- jQuery对象合并、jQuery添加静态方法、jQuery添加DOM实例方法
实例效果: 代码演示: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http:/ ...
- js之数据类型(对象类型——构造器对象——数组2)
一.数组空位与undefined 数组空位:数组的某一个位置没有任何值 产生空位的原因:数组中两个逗号之间不放任何值:用new Array()的方法,参数里是个数字:通过一个不存在的下标去增加数组:增 ...
- js中对Object对象的一些常用操作总结
前言我前面的文章,写过js中“类”与继承的一些文章.ES5我们可以通过 构造函数 或者 Object.create()等方式来模拟出js中的“类”,当然,对象呢是类的实例化,我们可以通过如下方式创建对 ...
- JS入门之ActiveXObject对象(转载)
JS入门之ActiveXObject对象 此对象提供自动化对象的接口. function ActiveXObject(ProgID : String [, location : String] ...
- JS中的event 对象详解
JS中的event 对象详解 JS的event对象 Event属性和方法:1. type:事件的类型,如onlick中的click:2. srcElement/target:事件源,就是发生事件的 ...
- js中两个对象的比较
代码取自于underscore.js 1.8.3的isEqual函数. 做了一些小小的修改,主要是Function的比较修改. 自己也加了一些代码解读. <!DOCTYPE html> & ...
- MVC中处理Json和JS中处理Json对象
MVC中处理Json和JS中处理Json对象 ASP.NET MVC 很好的封装了Json,本文介绍MVC中处理Json和JS中处理Json对象,并提供详细的示例代码供参考. MVC中已经很好的封装了 ...
随机推荐
- linux shell脚本语法笔记
1.&,&&,|,|| &:除了最后一个cmd,前面的cmd均已后台方式静默执行,执行结果显示在终端上,个别的cmd错误不影响整个命令的执行,全部的cmd同时执行 &a ...
- 如何把链表以k个结点为一组进行翻转
[MT笔试题] 题目描述: K 链表翻转是指把每K个相邻的结点看成一组进行翻转,如果剩余结点不足 K 个,则保持不变.假设给定链表 1 -> 2 -> 3 -> 4 -> 5 ...
- Http帮助类(史上最详细帮助类)
分享一波干活,HttpHelper(支持设置获取Cookie和设置SSL证书) 代码 /// <summary> /// Http连接操作帮助类 /// </summar ...
- matlab中的eval函数使用
matlab中的eval函数使用 在matlab的命令行窗口中输入help eval命令回车就可以看到eval函数的官方解释,大概的意思就是执行matlab中的表达式,计算expression表示的代 ...
- Groovy单元测试框架spock基础功能Demo
spock是一款全能型的单元测试框架. 最近在做单元测试框架的调研和尝试,目前确定的方案框架包括是:spock,Junit,Mockito以及powermock.由于本身使用Groovy的原因,比较钟 ...
- 一张图讲解最少机器搭建FastDFS高可用分布式集群安装说明
很幸运参与零售云快消平台的公有云搭建及孵化项目.零售云快消平台源于零售云家电3C平台私有项目,是与公司业务强耦合的.为了适用于全场景全品类平台,集团要求项目平台化,我们抢先并承担了此任务.并由我来主 ...
- R画图——分屏
最近项目需求,用R画了一个九宫格的图,第一次画,将简化后的脚本呈现一下,不是有人说,既然做了,那就摆出来吧. *中文行为说明: args <- commandArgs(T) 调用命令行读取 fi ...
- shell中tar加密打包
tar 打包是一个很常见的操作,但是当打了一个包却又不想让别人看到里面的小秘密的时候就可以使用加密的方法进行打包. 以下是一个脚本实现的加密打包和解密的shell脚本: cat tar_passwor ...
- Arduino 处理JSON格式的数据
Arduino 处理JSON格式的数据 1.安装 ArduinoJson这个包 2.程序代码 # include <ArduinoJson.h> #define ALINK_BODY_FO ...
- 开始逆向objc基础准备(二)我的平台是simulator-x86_64
建项目运行中断调试,lldb中显示寄存器看到有rax-r15, stm0-stm7, xmm0-xmm15, ymm0-ymm15,即为x64体系支持sse4. 再在lldb中查看寄存器别名得到以下对 ...