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 相关文章推荐
js实现双向链表互联网机顶盒实战应用实现
Oct 28 Javascript
get(0).tagName获得作用标签示例代码
Oct 08 Javascript
node.js中的fs.writeFile方法使用说明
Dec 14 Javascript
使用Plupload实现直接上传附件至七牛云存储
Dec 26 Javascript
JavaScript实现SHA-1加密算法的方法
Mar 11 Javascript
jQuery+HTML5实现手机摇一摇换衣特效
Jun 05 Javascript
关于微信jssdk实现多图片上传的一点心得分享
Dec 13 Javascript
微信小程序 ecshop地址三级联动实现实例代码
Feb 28 Javascript
vue-infinite-loading2.0 中文文档详解
Apr 08 Javascript
vue项目base64字符串转图片的实现代码
Jul 13 Javascript
vue-quill-editor 自定义工具栏和自定义图片上传路径操作
Aug 03 Javascript
Vue+Element UI实现概要小弹窗的全过程
May 30 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
ThinkPHP CURD方法之order方法详解
2014/06/18 PHP
THINKPHP支持YAML配置文件的设置方法
2015/03/17 PHP
Yii控制器中filter过滤器用法分析
2016/07/15 PHP
示例详解Laravel的注册重构
2016/08/14 PHP
PHP实现的mongoDB数据库操作类完整实例
2018/04/10 PHP
PHP使用ajax的post方式下载excel文件简单示例
2019/08/06 PHP
document.all与WEB标准
2020/05/13 Javascript
JQUBar 基于JQUERY的柱状图插件
2010/11/23 Javascript
jQuery对表单元素的取值和赋值操作代码
2011/05/19 Javascript
jquery对dom的操作常用方法整理
2013/06/25 Javascript
深入理解JS addLoadEvent函数
2016/05/20 Javascript
Javascript之Math对象详解
2016/06/07 Javascript
js HTML5 Canvas绘制转盘抽奖
2020/09/13 Javascript
基于jQuery实现的幻灯图片切换
2016/12/02 Javascript
微信开发之微信jssdk录音功能开发示例
2018/10/22 Javascript
Python实现将数据库一键导出为Excel表格的实例
2016/12/30 Python
python提取包含关键字的整行数据方法
2018/12/11 Python
Python中常用的内置方法
2019/01/28 Python
一个可以套路别人的python小程序实例代码
2019/04/09 Python
Python pandas用法最全整理
2019/08/04 Python
Python 多进程、多线程效率对比
2020/11/19 Python
CSS3中的content属性使用示例
2015/07/20 HTML / CSS
舒适的豪华鞋:Taryn Rose
2018/05/03 全球购物
英国网上购买门:Direct Doors
2018/06/07 全球购物
留学生如何写好自荐信
2013/12/27 职场文书
特色冷饮店创业计划书
2014/01/28 职场文书
2014年教师节寄语
2014/04/03 职场文书
消防安全承诺书
2014/05/22 职场文书
2014预备党员批评与自我批评思想汇报
2014/09/20 职场文书
公司门卫岗位职责
2015/04/13 职场文书
2015年党员岗位承诺书
2015/04/27 职场文书
员工辞职信范文大全
2015/05/12 职场文书
2015年乡镇工会工作总结
2015/05/19 职场文书
国庆节新闻稿
2015/07/17 职场文书
2019旅游导游工作总结
2019/06/27 职场文书
python图像处理基本操作总结(PIL库、Matplotlib及Numpy)
2021/06/08 Python