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 MVC框架Backbone.js详解
Sep 18 Javascript
基于JS实现textarea中获取动态剩余字数的方法
May 25 Javascript
AngularJS 表达式详细讲解及实例代码
Jul 26 Javascript
jQuery中的100个技巧汇总
Dec 15 Javascript
基于JavaScript实现瀑布流效果
Mar 29 Javascript
Angular4表单验证代码详解
Sep 03 Javascript
初识 Vue.js 中的 *.Vue文件
Nov 22 Javascript
关于echarts在节点显示动态数据及添加提示文本所遇到的问题
Apr 20 Javascript
在 Vue 项目中引入 tinymce 富文本编辑器的完整代码
May 04 Javascript
关于vue-cli 3配置打包优化要点(推荐)
Apr 22 Javascript
Vue2.0实现简单分页及跳转效果
Jul 29 Javascript
nuxt+axios实现打包后动态修改请求地址的方法
Apr 22 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
mysqli_set_charset和SET NAMES使用抉择及优劣分析
2013/01/13 PHP
Ubuntu中启用php的mail()函数并解决发送邮件速度慢问题
2015/03/27 PHP
php版微信自动登录并获取昵称的方法
2016/09/23 PHP
php-msf源码详解
2017/12/25 PHP
php实现微信企业付款到个人零钱功能
2018/10/09 PHP
JavaScript入门教程(7) History历史对象
2009/01/31 Javascript
Javascript学习笔记1 数据类型
2010/01/11 Javascript
学习javascript,实现插入排序实现代码
2011/07/31 Javascript
javascript解决innerText浏览器兼容问题思路代码
2013/05/17 Javascript
js时间戳格式化成日期格式的多种方法
2013/11/11 Javascript
简单实现js间歇或无缝滚动效果
2016/06/29 Javascript
jQuery Checkbox 全选 反选的简单实例
2016/11/29 Javascript
移动端界面的适配
2017/01/11 Javascript
node.js实现登录注册页面
2017/04/08 Javascript
jquery与js实现全选功能的区别
2017/06/11 jQuery
js中的事件委托或是事件代理使用详解
2017/06/23 Javascript
vuex 项目结构目录及一些简单配置介绍
2018/04/08 Javascript
Python读取一个目录下所有目录和文件的方法
2016/07/15 Python
基于Python实现对PDF文件的OCR识别
2016/08/05 Python
python3中dict(字典)的使用方法示例
2017/03/22 Python
Python线程池模块ThreadPoolExecutor用法分析
2018/12/28 Python
python+mysql实现学生信息查询系统
2019/02/21 Python
Python中logging日志的四个等级和使用
2020/11/17 Python
Python的logging模块基本用法
2020/12/24 Python
python中random模块详解
2021/03/01 Python
通过一张图教会你CSS3倒影的实现
2017/09/26 HTML / CSS
TUMI澳大利亚网站:美国旅行箱包品牌
2017/03/27 全球购物
MONNIER Frères英国官网:源自巴黎女士奢侈品配饰电商平台
2018/12/06 全球购物
优良学风班申请材料
2014/02/13 职场文书
运动会广播稿100字
2014/09/14 职场文书
2015年银行个人工作总结
2015/05/14 职场文书
尊师重教主题班会
2015/08/14 职场文书
纪念建国70周年演讲稿
2019/07/19 职场文书
导游词之神仙居景区
2019/11/15 职场文书
python geopandas读取、创建shapefile文件的方法
2021/06/29 Python
JavaScript的Set数据结构详解
2022/02/18 Javascript