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 相关文章推荐
jQuery之自动完成组件的深入解析
Jun 19 Javascript
jQuery中:visible选择器用法实例
Dec 30 Javascript
javascript实现仿IE顶部的可关闭警告条
May 05 Javascript
javascript实现网页背景烟花效果的方法
Aug 06 Javascript
javascript生成img标签的3种实现方法(对象、方法、html)
Dec 25 Javascript
JS JSOP跨域请求实例详解
Jul 04 Javascript
Angular 应用技巧总结
Sep 14 Javascript
js 实现一些跨浏览器的事件方法详解及实例
Oct 27 Javascript
微信端开发--登录小程序步骤
Jan 11 Javascript
Vue面试题及Vue知识点整理
Oct 07 Javascript
微信小程序开发(二):页面跳转并传参操作示例
Jun 01 Javascript
js+canvas绘制图形验证码
Sep 21 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
mysql4.1以上版本连接时出现Client does not support authentication protocol问题解决办法
2007/03/15 PHP
PHP下10件你也许并不了解的事情
2008/09/11 PHP
PHP读取RSS(Feed)简单实例
2014/06/12 PHP
修改ThinkPHP缓存为Memcache的方法
2014/06/25 PHP
利用XMLHTTP传递参数在另一页面执行并刷新本页
2006/10/26 Javascript
[全兼容哦]--实用、简洁、炫酷的页面转入效果loing
2007/05/07 Javascript
js正文内容高亮效果的实现方法
2013/06/30 Javascript
选择复选框按钮置灰否则按钮可用
2014/05/22 Javascript
JavaScript中Number.MAX_VALUE属性的使用方法
2015/06/04 Javascript
举例讲解JavaScript substring()的使用方法
2015/11/09 Javascript
详解Weex基于Vue2.0开发模板搭建
2017/03/20 Javascript
Angular中响应式表单的三种更新值方法详析
2017/08/22 Javascript
JavaScript使用atan2来绘制箭头和曲线的实例
2017/09/14 Javascript
详解nodejs中express搭建权限管理系统
2017/09/15 NodeJs
解决vue 打包发布去#和页面空白的问题
2018/09/04 Javascript
webpack 动态批量加载文件的实现方法
2020/03/19 Javascript
Vue项目如何引入bootstrap、elementUI、echarts
2020/11/26 Vue.js
[02:47]DOTA2亚洲邀请赛 HR战队出场宣传片
2015/02/07 DOTA
[01:09:13]DOTA2-DPC中国联赛 正赛 CDEC vs XG BO3 第三场 1月19日
2021/03/11 DOTA
Python标准库之sqlite3使用实例
2014/11/25 Python
Python编程中对文件和存储器的读写示例
2016/01/25 Python
python编写简单爬虫资料汇总
2016/03/22 Python
python验证码识别的示例代码
2017/09/21 Python
Python实现数据可视化看如何监控你的爬虫状态【推荐】
2018/08/10 Python
Django用户身份验证完成示例代码
2020/04/03 Python
丝芙兰巴西官方商城:SEPHORA巴西
2016/10/31 全球购物
AJAX的优缺点都有什么
2015/08/18 面试题
补充协议书范本
2014/04/23 职场文书
模具设计与制造专业求职信
2014/07/19 职场文书
党员自我剖析材料范文
2014/10/06 职场文书
四风问题个人剖析材料
2014/10/07 职场文书
党的群众路线教育实践活动查摆问题自查报告
2014/10/10 职场文书
食品仓管员岗位职责
2015/04/01 职场文书
张思德观后感
2015/06/09 职场文书
2016年学校爱国卫生月活动总结
2016/04/06 职场文书
Vue Mint UI mt-swipe的使用方式
2022/06/05 Vue.js