JavaScript实现JSON合并操作示例【递归深度合并】


Posted in Javascript onSeptember 07, 2018

本文实例讲述了JavaScript实现JSON合并操作。分享给大家供大家参考,具体如下:

为什么我会想到写这几行代码

在实际工作中,我们会使用许多或自主开发或第三方的工具,有些工具的配置文件相当细节,使用频率低倒也罢了,使用频率高的话必然造成很多代码冗余。所以我都会对这些工具做二次封装,把不经常改动的配置给予默认值。如果需要改动,传入新的配置覆盖原来的配置即可。

起初我以为这是一项很简单的需求

var json1 = {  // 固定的配置
 a: 1,
 b: 2,
 c: 3,
}
var json2 = {  // 作为参数传入的配置
 a: 11,
 d: 14,
}
json3 = {  // 合并后的结果
 a: 11,
 b: 2,
 c: 3,
 d: 14,
}

如上述,确实很简单。可事实是,当配置不再是仅仅一层嵌套时,常用的合并如$.extendfor in 赋值就不再能再解决问题了

var json1 = {
 a: 1,
 b: {
  b1: 'hello',
  b2: 'world',
 },
}
var json2 = {
 b: { b2: 'china' },
 c: 3,
}
json3 = {  // 合并后的结果
 a: 1,
 b: { b2: 'chila' },
 c: 3,
}

可以看出,我们的本意是希望json2里的b.b2: 'china'取代json1里的b.b2: 'world', 可是实际上,常规的结果只会把整个object/json取代,而不会去遍历其中的属性,在本例中导致了b.b1的丢失。

于是就有了如下几行代码:

// 遇到相同元素级属性,以后者(main)为准
// 不返还新Object,而是main改变
function mergeJSON (minor, main) {
 for (var key in minor) {
  if (main[key] === undefined) { // 不冲突的,直接赋值
   main[key] = minor[key];
   continue;
  }
  // 冲突了,如果是Object,看看有么有不冲突的属性
  // 不是Object 则以main为主,忽略即可。故不需要else
  if (isJSON(minor[key])) {
   // arguments.callee 递归调用,并且与函数名解耦
   arguments.callee(minor[key], main[key]);
  }
 }
}
// 附上工具
function isJSON(target) {
 return typeof target == "object" && target.constructor == Object;
}

虽然只有十几行的代码,但还是挺实用。粗略的挖掘了一下搜索引擎,好像并没有更合适解决问题的代码。简单的递归思想和argument.callee琢磨一下也是有些味道的

Javascript 相关文章推荐
javascript 学习笔记(六)浏览器类型及版本信息检测代码
Apr 08 Javascript
jQuery给动态添加的元素绑定事件的方法
Mar 09 Javascript
jQuery插件Validate实现自定义校验结果样式
Jan 18 Javascript
JavaScript中split与join函数的进阶使用技巧
May 03 Javascript
Bootstrap菜单按钮及导航实例解析
Sep 09 Javascript
微信小程序 两种滑动方式(横向滑动,竖向滑动)详细及实例代码
Jan 13 Javascript
JS 实现 ajax 异步浏览器兼容问题
Jan 21 Javascript
简单实现js选项卡切换效果
Feb 09 Javascript
vue.js 双层嵌套for遍历的方法详解, 类似php foreach()
Sep 07 Javascript
微信小程序实现左侧滑动导航栏
Apr 08 Javascript
ES11新增的这9个新特性,你都掌握了吗
Oct 15 Javascript
详解vue实现坐标拾取器功能示例
Nov 18 Vue.js
Bootstrap-table使用footerFormatter做统计列功能
Sep 07 #Javascript
jQuery实现为动态添加的元素绑定事件实例分析
Sep 07 #jQuery
Bootstrap-table自定义可编辑每页显示记录数
Sep 07 #Javascript
vue.js 双层嵌套for遍历的方法详解, 类似php foreach()
Sep 07 #Javascript
jQuery插件实现的日历功能示例【附源码下载】
Sep 07 #jQuery
vue利用v-for嵌套输出多层对象,分别输出到个表的方法
Sep 07 #Javascript
Vue中使用sass实现换肤功能
Sep 07 #Javascript
You might like
生成sessionid和随机密码的例子
2006/10/09 PHP
sourcesafe管理phpproj文件的补充说明(downmoon)
2009/04/11 PHP
PHP Session变量不能传送到下一页的解决方法
2009/11/27 PHP
关于Yii2框架跑脚本时内存泄漏问题的分析与解决
2019/12/01 PHP
Mozilla中显示textarea中选择的文字
2006/09/07 Javascript
Save a File Using a File Save Dialog Box
2007/06/18 Javascript
js控制滚动条缓慢滚动到顶部实现代码
2013/03/20 Javascript
使用jquery自定义鼠标样式满足个性需求
2013/11/05 Javascript
javascript中普通函数的使用介绍
2013/12/19 Javascript
JS实现自动切换文字的导航效果代码
2015/08/27 Javascript
百度地图给map添加右键菜单(判断是否为marker)
2016/03/04 Javascript
jQuery添加和删除输入文本框标签代码
2016/05/20 Javascript
JavaScript中Array对象用法实例总结
2016/11/29 Javascript
vue里面使用mui的弹出日期选择插件实例
2018/09/16 Javascript
VUE+Element UI实现简单的表格行内编辑效果的示例的代码
2018/10/31 Javascript
基于React Native 0.52实现轮播图效果
2020/08/25 Javascript
微信小程序学习笔记之登录API与获取用户信息操作图文详解
2019/03/29 Javascript
mapboxgl区划标签避让不遮盖实现的代码详解
2020/07/01 Javascript
详解Python中的静态方法与类成员方法
2017/02/28 Python
详细分析python3的reduce函数
2017/12/05 Python
Python实现的寻找前5个默尼森数算法示例
2018/03/25 Python
Python3.5常见内置方法参数用法实例详解
2019/04/29 Python
python3.6中@property装饰器的使用方法示例
2019/08/17 Python
Python 实现自动完成A4标签排版打印功能
2020/04/09 Python
利用CSS3制作简单的3d半透明立方体图片展示
2017/03/25 HTML / CSS
zooplus波兰:在线宠物店
2019/07/21 全球购物
King Apparel官网:英国街头服饰品牌
2019/09/05 全球购物
MIRTA官网:手工包,100%意大利制造
2020/02/11 全球购物
为什么如下的代码int a=100,b=100;long int c=a * b;不能工作
2013/11/29 面试题
《望洞庭》教学反思
2014/02/16 职场文书
信息管理应届生求职信
2014/03/07 职场文书
高中教师先进事迹材料
2014/08/22 职场文书
学校政风行风评议工作总结
2014/10/21 职场文书
英语导游欢迎词
2015/09/30 职场文书
再也不用花钱买漫画!Python爬取某漫画的脚本及源码
2021/06/09 Python
AudioContext 实现音频可视化(web技术分享)
2022/02/24 Javascript