首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

js 深度合并json对象

在JavaScript中,深度合并JSON对象是指将两个或多个JSON对象合并成一个新对象,并且如果这些对象中有嵌套的对象或数组,也要进行递归合并,而不是简单的覆盖。

基础概念

  • 浅合并:只合并对象的顶层属性,如果属性值是对象或数组,则不进行合并,而是直接覆盖。
  • 深合并:递归地合并对象的所有属性,包括嵌套的对象和数组。

优势

  • 数据完整性:深合并可以确保所有层级的属性都被考虑在内,避免数据丢失。
  • 灵活性:适用于配置合并、状态管理等场景,可以灵活地合并不同来源的数据。

类型

  • 对象合并:合并普通对象。
  • 数组合并:合并数组,可以选择去重、拼接或深度合并数组中的对象。

应用场景

  • 配置管理:合并用户自定义配置和默认配置。
  • 状态管理:在Redux等状态管理库中合并状态。
  • 数据聚合:从多个API响应中合并数据。

示例代码

以下是一个使用递归实现深度合并的函数:

代码语言:txt
复制
function isObject(obj) {
    return obj && typeof obj === 'object' && !Array.isArray(obj);
}

function deepMerge(target, ...sources) {
    if (!sources.length) return target;
    const source = sources.shift();

    if (isObject(target) && isObject(source)) {
        for (const key in source) {
            if (isObject(source[key])) {
                if (!target[key]) Object.assign(target, { [key]: {} });
                deepMerge(target[key], source[key]);
            } else {
                Object.assign(target, { [key]: source[key] });
            }
        }
    }

    return deepMerge(target, ...sources);
}

// 使用示例
const obj1 = { a: 1, b: { c: 2 } };
const obj2 = { b: { d: 3 }, e: 4 };
const mergedObj = deepMerge({}, obj1, obj2);

console.log(mergedObj); // 输出: { a: 1, b: { c: 2, d: 3 }, e: 4 }

遇到的问题及解决方法

  • 循环引用:如果对象中存在循环引用,上述函数会导致栈溢出错误。可以通过维护一个已访问对象的列表来避免这个问题。
  • 特殊对象处理:上述函数没有处理Date、RegExp、Map、Set等特殊对象。在实际应用中,可能需要根据具体情况添加对这些类型的处理逻辑。

解决循环引用问题

代码语言:txt
复制
function deepMerge(target, ...sources) {
    const visited = new WeakSet();

    function merge(target, source) {
        if (isObject(target) && isObject(source)) {
            if (visited.has(target) || visited.has(source)) {
                return; // 避免循环引用
            }
            visited.add(target);
            visited.add(source);

            for (const key in source) {
                if (isObject(source[key])) {
                    if (!target[key]) Object.assign(target, { [key]: {} });
                    merge(target[key], source[key]);
                } else {
                    Object.assign(target, { [key]: source[key] });
                }
            }
        }
    }

    sources.forEach(source => merge(target, source));
    return target;
}

通过这种方式,可以实现一个更加健壮的深度合并函数,能够处理更复杂的情况。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • js数组、json、js对象的区别与联系

    最近在敲代码时,遇上了一个关于JS数组的问题,由此引发了关于对象和json的联想,曾经觉得很畅顺的知识点突然模糊了。于是,为了理清这些东西,有了如下这篇文章。...(2)自定义js对象,这里我构造一个和json相似的对象来找到区别,这里写了两种构造方法 var person = {key:“value”} var person = new object();...字符串) ==》 转化成json对象 JSON.stringify(json对象) ==》转化为json字符串 二、js对象与json对象 js对象, var person = {key:“...记得上面概念里,js所有事物都是对象,那么我们完全可以把json对象当做js对象的子集,string只是js对象的key的数据类型中的一个选项 额外说一点,js里面是没有键值对数组这一说的,现有的这种键值对数组...,即map json格式常用于数据传输方面,其他情况遇到类似json对象的形式,可以把它当成是特殊的js对象来处理,例子如下 var a = { “star”:{“img”:require

    9.4K40

    js如何将json字符串转成json对象_前端json字符串转json对象

    ”: “man” }’; JSON对象: var str2 = { “name”: “cxh”, “sex”: “man” }; 一、JSON字符串转换为JSON对象 要使用上面的str1,必须使用下面的方法先转化为...JSON对象: //由JSON字符串转换为JSON对象 var obj = eval(‘(‘ + str + ‘)’); 或者 var obj = str.parseJSON(); //由JSON字符串转换为...JSON对象 或者 var obj = JSON.parse(str); //由JSON字符串转换为JSON对象 然后,就可以这样读取: Alert(obj.name); Alert(obj.sex);...特别注意:如果obj本来就是一个JSON对象,那么使用eval()函数转换后(哪怕是多次转换)还是JSON对象,但是使用parseJSON()函数处理后会有问题(抛出语法异常)。...例如: var last=obj.toJSONString(); //将JSON对象转化为JSON字符 或者 var last=JSON.stringify(obj); //将JSON对象转化为JSON

    9.4K30

    js将json字符串转换成json对象_json对象转字符串

    json简介及json字符串转换成json对象 JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式 它基于ECMAScript (欧洲计算机协会制定的...js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。...JSON有两种表示结构: 对象和数组 对象结构以”{”大括号开始,以”}”大括号结束。...外面使用单引号 对象里面的属性要使用 双引号包裹 属性的值如果是数组使用[ ] 每个属性直接用逗号隔开 json字符串:指的是符合json格式要求的js字符串。...例如:var jsonStr = “{studentID:‘06’,name:’zhangsan ‘,age:‘18’}”; json对象:指符合json格式要求的js对象。

    8.2K30

    vue-jsonp_js创建json数组对象

    一、JSON格式 在JSON中,字符串必须用双引号包裹。JSON由若干key:value的格式的数据组成。其中key值必须为字符串,value可以为字符串、数字、对象、数组、布尔型、null。...前后端分离开发中,后端返回的接口中的数据是json字符串格式,json字符串元素的属性或者说key值用双引号””,参考如下: 而前端需要处理成json对象格式,参考如下格式 二、JSON字符串和JSON...对象相互转换 1.如何将json字符串转换为json对象呢 通过JSON.parse() 方法 JSON.parse(字符串) //将该字符串转为json对象给前端使用 2.如何将json对象转换为json...字符串 通过JSON.stringify() 方法 JSON.stringify(json对象) //将json对象转换为json字符串,传给后端 版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人

    6.8K20

    JS对象与JSON格式数据相互转换

    最近遇到这个问题,JS对象和JSON格式数据的相互转换。...其实,也就是两个问题:JS对象转换成为JSON格式数据、JSON格式数据转换成为JS对象 目前的项目数据交互几乎都用JQuery,所以处理流程是:前端页面数据-》JS对象-》jQuery提交-》python...python肯定不能直接处理JS对象数据,所以要把JS对象转换成为python能处理的一种数据格式(通常是字典dict),同样,python取数据反馈到前端也要把字典数据转换成JS能处理的对象,这个中间转换数据格式通常就是...一、JS对象转换成为JSON 流程:读取前端页面数据,组装成为JS对象,并通过jQuery的$.post()方法传递给python。...格式的数据 处理:用jQuery的一个方法$.parseJSON()将JSON格式的数据转成JS对象。

    5.3K50
    领券