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 相关文章推荐
phpwind放自动注册方法
Dec 02 Javascript
不用MOUSEMOVE也能滑动啊
May 23 Javascript
xss文件页面内容读取(解决)
Nov 28 Javascript
JavaScript 代码压缩工具小结
Feb 27 Javascript
javascript实现简单的贪吃蛇游戏
Mar 31 Javascript
jquery悬浮提示框完整实例
Jan 13 Javascript
JS获取IMG图片高宽的简单实例
May 17 Javascript
bootstrap flask登录页面编写实例
Nov 01 Javascript
phantomjs导出html到pdf的方法总结
Oct 19 Javascript
javascript对HTML字符转义与反转义
Dec 13 Javascript
JavaScript判断对象和数组的两种方法
May 31 Javascript
angular组件间通讯的实现方法示例
May 07 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
限制ckeditor上传图片文件大小的方法
2013/11/15 PHP
javascript下function声明一些小结
2007/12/28 Javascript
基于JQuery的cookie插件
2010/04/07 Javascript
页面载入结束自动调用js函数示例
2013/09/23 Javascript
利用js实现在浏览器状态栏显示访问者在本页停留的时间
2013/12/29 Javascript
jquery序列化form表单使用ajax提交后处理返回的json数据
2014/03/03 Javascript
上传文件返回的json数据会被提示下载问题解决方案
2014/12/03 Javascript
js实现瀑布流的三种方式比较
2020/06/28 Javascript
Bootstrap每天必学之警告框插件
2016/04/26 Javascript
浅析javascript异步执行函数导致的变量变化问题解决思路
2016/05/13 Javascript
js添加千分位的实现代码(超简单)
2016/08/01 Javascript
JS实现HTML标签转义及反转义
2020/04/14 Javascript
nodejs对express中next函数的一些理解
2017/09/08 NodeJs
浅谈React中组件间抽象
2018/01/27 Javascript
vue实现简单的日历效果
2020/09/24 Javascript
javascript的惯性运动实现代码实例
2019/09/07 Javascript
nodejs nedb 封装库与使用方法示例
2020/02/06 NodeJs
关于element的表单组件整理笔记
2021/02/05 Javascript
常见的在Python中实现单例模式的三种方法
2015/04/08 Python
python学习教程之使用py2exe打包
2017/09/24 Python
使用tensorflow实现线性回归
2018/09/08 Python
Python爬虫小技巧之伪造随机的User-Agent
2018/09/13 Python
Python对接六大主流数据库(只需三步)
2019/07/31 Python
Keras设定GPU使用内存大小方式(Tensorflow backend)
2020/05/22 Python
利用Python如何制作贪吃蛇及AI版贪吃蛇详解
2020/08/24 Python
python re的findall和finditer的区别详解
2020/11/15 Python
python中time.ctime()实例用法
2021/02/03 Python
TripAdvisor印尼站:全球领先的旅游网站
2018/03/15 全球购物
Eagle Eyes Optics鹰眼光学:高性能太阳镜
2018/12/07 全球购物
Club Monaco加拿大官网:设计师男女服装
2019/09/29 全球购物
人力资源行政经理自我评价
2013/10/23 职场文书
安全施工责任书
2014/08/25 职场文书
毕业论文答辩开场白和结束语
2015/05/27 职场文书
2016年读书月活动总结范文
2016/04/06 职场文书
Pygame Event事件模块的详细示例
2021/11/17 Python
Nginx 反向代理解决跨域问题多种情况分析
2022/01/18 Servers