效果

  1. 原数据
  2. {
  3. "id": 10,
  4. "text": {
  5. "title": "title",
  6. "content": "content"
  7. },
  8. "image": {
  9. "url": "image url",
  10. "name": "image name",
  11. "size": "900KB"
  12. }
  13. }
  14. 1.还原(拆解)属性链
  15. [
  16. {
  17. "key": "id",
  18. "value": 10
  19. },
  20. {
  21. "key": "text.title",
  22. "value": "title"
  23. },
  24. {
  25. "key": "text.content",
  26. "value": "content"
  27. },
  28. {
  29. "key": "image.url",
  30. "value": "image url"
  31. },
  32. {
  33. "key": "image.name",
  34. "value": "image name"
  35. },
  36. {
  37. "key": "image.size",
  38. "value": "900KB"
  39. }
  40. ]
  41. 2.合并属性链
  42. {
  43. "id": 10,
  44. "text": {
  45. "title": "title",
  46. "content": "content"
  47. },
  48. "image": {
  49. "url": "image url",
  50. "name": "image name",
  51. "size": "900KB"
  52. }
  53. }

关键代码

  1. // 合并属性链
  2. Merge(items): any {
  3. var res = {}
  4. for (let i = 0; i < items.length; i++) {
  5. var item = items[i];
  6. // key
  7. var prochains: string[] = item.key.split('.');//属性链
  8. var tmpObj = res;
  9. //组织属性
  10. for (let i = 0; i < prochains.length; i++) {
  11. const pro = prochains[i];
  12. var islast = i == prochains.length - 1;
  13. //没有属性就创建为obj
  14. if (!tmpObj.hasOwnProperty(pro)) {
  15. tmpObj[pro] = {}
  16. }
  17. else {
  18. //检查一下,如果已经有属性了, 并且现在不是最后一个属性, 那么这个地方应该是obj,不是的话说明属性链有问题
  19. if(typeof tmpObj[pro]!=="object"&&!islast){
  20. tmpObj[pro] = {}
  21. }
  22. }
  23. //属性链最后一个要赋值
  24. if (islast) {
  25. // value
  26. tmpObj[pro] = item.value;
  27. }
  28. //属性下钻
  29. tmpObj = tmpObj[pro]
  30. }
  31. }
  32. return res;
  33. }
  34. // 还原属性链
  35. objPro2ProDic(obj, dic, root) {
  36. if (!dic) {
  37. dic = [];
  38. }
  39. for (const key in obj) {
  40. if (obj.hasOwnProperty(key)) {
  41. const ele = obj[key];
  42. if (typeof ele === "object" && !(ele instanceof Array)) {
  43. //下钻
  44. this.objPro2ProDic(ele, dic,key)
  45. }
  46. else{
  47. var _key = root?`${root}.${key}`:key;
  48. // 这里返回key-value
  49. dic.push({
  50. key:_key,
  51. value:ele
  52. });
  53. }
  54. }
  55. }
  56. return dic;
  57. }

示例代码

示例代码

合并 && 还原属性链的更多相关文章

  1. 【WPF学习笔记】[转]周银辉之WPF中的动画 && 晓风影天之wpf动画——new PropertyPath属性链

    (一)WPF中的动画 动画无疑是WPF中最吸引人的特色之一,其可以像Flash一样平滑地播放并与程序逻辑进行很好的交互.这里我们讨论一下故事板. 在WPF中我们采用Storyboard(故事板)的方式 ...

  2. 2016湖南省赛 I Tree Intersection(线段树合并,树链剖分)

    2016湖南省赛 I Tree Intersection(线段树合并,树链剖分) 传送门:https://ac.nowcoder.com/acm/contest/1112/I 题意: 给你一个n个结点 ...

  3. [No000098]SVN学习笔记5-分支,合并,属性,补丁,锁,分支图

    行结束符和空白选项 在项目的生命周期中,有时可能会将行结束符由 CRLF 改为 LF,或者修改一段代码的缩进.不幸的是这样将会使大量的代码行被标记为已修改,尽管代码本身并没有被修改.这里列出的选项将会 ...

  4. List集合,对象根据某个相同的属性,合并另外属性

    描述及实现: 1.List中有 Modular字段值有重复一样的2.Modular字段一样的话去重并且OrderAmount相加 HashMap<String,DataReport> te ...

  5. js篇-数组合并其中属性值相同的项目且属性值相加

    项目背景是:var a = [{id:1,num:"12"},{id:2,num:"13"},{id:3,num:"3"},{id:2,nu ...

  6. 2019 renew 博客目录

    .net && .net core Microsoft.AspNet.SignalR实现弹幕(即时通讯) C#调用JS httpclient POST请求(urlencoded) 二维 ...

  7. NPOI操作EXCEL(五)——含合并单元格复杂表头的EXCEL解析

    我们在第三篇文章中谈到了那些非常反人类的excel模板,博主为了养家糊口,也玩命做出了相应的解析方法... 我们先来看看第一类复杂表头: ...... 博主称这类excel模板为略复杂表头模板(蓝色部 ...

  8. xtrabackup备份还原mariadb数据库

    一.xtrabackup 简介 xtrabackup 是由percona公司开源免费的数据库热备软件,它能对InnoDB数据库和XtraDB存储引擎的数据库非阻塞地备份,对于myisam的备份同样需要 ...

  9. MySQL数据库备份还原

    本文以CentOS 7 yum安装的MariaDB-server5.5为例,说明MySQL的几种 备份还原方式 将服务器A(192.168.1.100)上的数据库备份,还原到B(192.168.1.2 ...

随机推荐

  1. Activity 调用Service的方法

    一般来说,Activity调用Service 分为两种:进程内调用和进程间调用.进程内调用时比较常用的一种,在进程内调用中我们常常使用的是bindService来启动Service(关于这种启动方式的 ...

  2. UVA 1564 - Widget Factory(高斯消元)

    UVA 1564 - Widget Factory 题目链接 题意:n种零件, 给定m个制作时间.每段时间制作k个零件,每种零件有一个制作时间,每段时间用Mon到Sun表示,求每一个零件的制作时间.还 ...

  3. ios开发事件处理之:五:事件的响应

  4. 【社交分享SDK】ShareSDK for Android 2.5.9已经公布

    ShareSDK for Android 2.5.9已经公布 版本号:V2.5.9  2015-3-19 1.升级Dropbox对API接口的调用.包含授权.获取用户信息,分享三个接口 2.升级Kak ...

  5. nodejs版本号更新问题:express不是内部或外部命令

    版本号更新后,我们使用熟悉的npm install -g express命令安装,可是,成功安装之后竟然提示express不是内部或外部命令. nodejs小问题:[1]express不是内部或外部命 ...

  6. Android的NDK开发(1)————Android JNI简介与调用流程

    1.JNI简介 JNI全称为Java Native Interface(Java本地调用).从Java1.1开始,JNI成为java平台的一部分,它允许Java代码和其他语言写的代码(如C&C ...

  7. Android 仿微信朋友圈点击图片变暗

    package cn.eoe.leigo.view; import android.content.Context; import android.graphics.Bitmap; import an ...

  8. Golang快速入门

    Go语言简介: Golang 简称 Go,是一个开源的编程语言,Go是从2007年末由 Robert Griesemer, Rob Pike, Ken Thompson主持开发,后来还加入了Ian L ...

  9. Codeforces Round #443 (Div. 2) C: Short Program - 位运算

    传送门 题目大意: 输入给出一串位运算,输出一个步数小于等于5的方案,正确即可,不唯一. 题目分析: 英文题的理解真的是各种误差,从头到尾都以为解是唯一的. 根据位运算的性质可以知道: 一连串的位运算 ...

  10. erlang版本的protobuf

    这两天看了google protocol buffers的文档,protobuf非常不错,解决了一直以来遇到的消息版本不同的问题,对项目中的开发非常有帮助. 最近在学习erlang,官方只有java. ...