JavaScript实现JSON合并操作示例【递归深度合并】

JavaScript实现JSON合并操作示例【递归深度合并】

在JavaScript开发中,我们经常需要合并两个或多个JSON对象。如果不加注意,使用原生JavaScript合并JSON对象会遇到一些问题,比如仅会执行浅合并(只合并顶级属性且不支持数组合并)、忽略null和undefined属性。下面我们来介绍递归深度合并两个JSON对象的方法,解决上述问题。

递归深度合并两个JSON对象

递归深度合并有利于在合并具有深层嵌套结构的JSON对象时获得更准确的结果。

function deepMerge(target, source) {
  // 遍历源JSON对象
  for (const key of Object.keys(source)) {
    // 如果源对象当前属性是一个JSON对象,则递归地对其进行合并
    if (source[key] instanceof Object) {
      Object.assign(source[key], deepMerge(target[key], source[key]))
    }
  }
  // 合并所有属性
  return Object.assign({}, target, source)
}

// 示例1
const obj1 = { x: { y: 1 }, z: [3, 4] }
const obj2 = { x: { z: 3 }, y: 2 }
console.log(deepMerge(obj1, obj2)) // 输出 { x: { y: 1, z: 3 }, y: 2, z: [3, 4] }

// 示例2
const obj3 = { x: { y: { z: 1 } }, w: [2] }
const obj4 = { x: { y: { w: 3 } }, z: 3 }
console.log(deepMerge(obj3, obj4)) // 输出 { x: { y: { z: 1, w: 3 } }, w: [2], z: 3 }

上述代码中,我们定义了一个deepMerge()函数,它把目标JSON对象和源JSON对象作为输入参数。其中,我们首先使用Object.keys()方法遍历源JSON对象。若源对象当前属性是一个JSON对象,则递归地对其进行合并。最后调用Object.assign()方法对合并后的JSON对象进行合并。

示例说明

示例1

obj1中有x和z两个属性。x是一个子对象,包含一个y属性,而z是一个数组,包含两个元素3和4。obj2中包含x、y两个属性,x也是一个子对象,包含z属性。运行结果表明,deepMerge()方法成功地将两个JSON对象合并为一个JSON对象,并递归地合并了它们的x子对象,将y属性的值从obj2合并到了obj1,同时z属性值也正确地合并了。

示例2

obj3比obj1更深层嵌套,包含x属性作为子对象,x又包含y属性作为子对象,y包含z属性作为末级属性。同样,对于obj4,x是一个子对象,包含y属性和z属性。运行结果表明,我们成功地把这两个JSON对象递归合并了,同时正确地合并了z属性,并将y子对象合并起来,并添加了一个新属性w到y子对象。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JavaScript实现JSON合并操作示例【递归深度合并】 - Python技术站

(0)
上一篇 2023年5月23日
下一篇 2023年5月23日

相关文章

  • C++实现STL迭代器萃取的示例代码

    一、什么是迭代器萃取? 迭代器萃取是一种通过编译时模板元编程技术,获取迭代器类型相关信息的方法。例如,获取迭代器的 value_type、iterator_category、difference_type 和 pointer 等信息。通过迭代器萃取,我们可以更加精确地对各种类型的迭代器进行操作,并且提供更高的泛型性和可重用性。 迭代器萃取一般通过 C++ S…

    C 2023年5月24日
    00
  • C++中的异常处理机制详解

    C++中的异常处理机制详解 异常处理是C++中一种非常重要的机制,它可以让我们在程序运行过程中发生错误时进行适当的处理。本文将详细介绍C++中的异常处理机制、异常的分类、异常的捕获以及在程序中如何使用异常处理。 异常的分类 C++中的异常可以分为三类:标准异常、自定义异常和硬件异常。 标准异常 标准异常是C++语言的内置异常,主要包括下面几种: std::e…

    C 2023年5月22日
    00
  • C语言实现推箱子游戏完整代码

    非常感谢您对于 C 语言实现推箱子游戏的关注! 推箱子游戏是一款非常经典的益智游戏,本文将完整讲解 C 语言实现推箱子游戏的攻略。 步骤一:准备工作 为了让代码更加简洁,我们需要引入外部库文件,本文使用的库文件为 <stdio.h> 与 <conio.h>,其中 <stdio.h> 是 C 语言的标准输入输出库, <…

    C 2023年5月30日
    00
  • 简述c++ 发展史

    简述C++ 发展史 C 语言的诞生 C++ 是在 C 语言的基础上发展出来的语言,因此我们先来介绍一下 C 语言的诞生。 C 语言诞生于 1972 年,由 Dennis Ritchie 在贝尔实验室开发,为 Unix 操作系统的编写提供了有效的工具。1983 年,C 语言的标准被 ANSI 委员会采纳。 C++ 的诞生 C++ 是在 C 语言基础上开发的,1…

    C 2023年5月23日
    00
  • 逍遥自在学C语言 | 条件控制的正确使用姿势

    前言 在C语言中,有三种条件判断结构:if语句、if-else语句和switch语句。 一、人物简介 第一位闪亮登场,有请今后会一直教我们C语言的老师 —— 自在。 第二位上场的是和我们一起学习的小白程序猿 —— 逍遥。 二、if语句 基本语法 if (条件) { // 代码块1 } 代码示例 #include <stdio.h> int mai…

    C 2023年5月9日
    00
  • 关于C++的重载运算符和重载函数

    关于C++的重载运算符和重载函数 什么是重载运算符和重载函数 在C++中,重载指的是在一个类中定义多个同名但是参数列表不同的成员函数或全局函数。当编译器遇到这些同名的函数时,会根据传入的参数类型和数量来确定具体要调用哪个函数,从而实现了多态性。 重载运算符指的是对C++中一个或多个运算符进行重新定义,让该运算符能够在自定义类型上进行操作。例如,我们可以通过重…

    C 2023年5月23日
    00
  • C++中的string类(C++字符串)入门完全攻略

    下面是C++中的string类(C++字符串)入门完全攻略的详细讲解: 1. 什么是string类? string类是C++标准库提供的用于处理字符串的类,它提供了许多方便的方法来操作字符串,比如字符串的拼接、查找、替换等等,使得C++中的字符串处理变得更加轻松和高效。 2. string类的基本用法 (1)字符串的定义和初始化 在使用string类之前,可…

    C 2023年5月22日
    00
  • C语言中如何进行模板编程?

    C语言中的模板编程通常是通过宏定义来实现的,宏定义可以根据指定的参数生成对应的代码片段,从而实现代码重用和泛型代码实现的效果。下面就是详细讲解C语言中如何进行模板编程的完整攻略: 1. 宏定义 定义宏是将一个复杂的表达式或者代码块定义为一个名字,以后可以直接使用该名字调用相应的代码块。宏定义使用#define关键字,并给定宏的名称和宏的内容。示例如下: #d…

    C 2023年4月27日
    00
合作推广
合作推广
分享本页
返回顶部