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 动态将数字金额转化为中文大写金额
May 14 Javascript
file模式访问网页时iframe高度自适应解决方案
Jan 16 Javascript
编写js扩展方法判断一个数组中是否包含某个元素
Nov 08 Javascript
javascript中typeof操作符和constucor属性检测
Feb 26 Javascript
基于Bootstrap+jQuery.validate实现表单验证
May 30 Javascript
JavaScript获取URL中参数querystring的方法详解
Oct 11 Javascript
Node.js中process模块常用的属性和方法
Dec 13 Javascript
js实现点击每个li节点,都弹出其文本值及修改
Dec 15 Javascript
javascript实现滑动解锁功能
Mar 22 Javascript
JS实现手写parseInt的方法示例
Sep 24 Javascript
JavaScript去掉数组重复项的方法分析【测试可用】
Jul 19 Javascript
vuex管理状态 刷新页面保持不被清空的解决方案
Nov 11 Javascript
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
php字符串函数学习之strstr()
2015/03/27 PHP
php排序算法实例分析
2016/10/17 PHP
PHP针对伪静态的注入总结【附asp与Python相关代码】
2017/08/01 PHP
文本框的字数限制功能jquery插件
2009/11/24 Javascript
使用JQuery进行跨域请求
2010/01/25 Javascript
javascript实现div的显示和隐藏的小例子
2013/06/25 Javascript
屏蔽script注入小例子
2013/11/12 Javascript
table行随鼠标移动变色示例
2014/05/07 Javascript
jquery计算鼠标和指定元素之间距离的方法
2015/06/26 Javascript
js操作cookie保存浏览记录的方法
2015/12/25 Javascript
jQuery获取cookie值及删除cookie用法实例
2016/04/15 Javascript
详解闭包解决jQuery中AJAX的外部变量问题
2017/02/22 Javascript
Vue列表页渲染优化详解
2017/07/24 Javascript
js数组实现权重概率分配
2017/09/12 Javascript
SVG动画vivus.js库使用小结(实例代码)
2017/09/14 Javascript
微信小程序 动画的简单实例
2017/10/12 Javascript
vue2之简易的pc端短信验证码的问题及处理方法
2019/06/03 Javascript
JavaScript剩余操作符Rest Operator详解
2019/07/20 Javascript
微信小程序用户拒绝授权的处理方法详解
2019/09/20 Javascript
[56:12]LGD vs Optic Supermajor小组赛D组胜者组决赛 BO3 第一场 6.3
2018/06/04 DOTA
python随机取list中的元素方法
2018/04/08 Python
一百多行python代码实现抢票助手
2018/09/25 Python
Python使用sorted对字典的key或value排序
2018/11/15 Python
python使用zip将list转为json的方法
2018/12/31 Python
关于tf.reverse_sequence()简述
2020/01/20 Python
基于Python数据结构之递归与回溯搜索
2020/02/26 Python
解决pycharm中opencv-python导入cv2后无法自动补全的问题(不用作任何文件上的修改)
2020/03/05 Python
解决Python 写文件报错TypeError的问题
2020/10/23 Python
目前不被任何主流浏览器支持的CSS3属性汇总
2014/07/21 HTML / CSS
法国奢华女性时尚配饰网上商店:Monnier Frères
2016/08/27 全球购物
Java的类可以定义为Protected或者Private得吗
2015/09/25 面试题
《伯牙绝弦》教学反思
2014/03/02 职场文书
保护环境建议书300字
2014/05/13 职场文书
雷峰塔导游词
2015/02/09 职场文书
家长会主持词开场白
2015/05/29 职场文书
小型企业的绩效考核制度模板
2019/11/21 职场文书