JavaScript 如何拷贝对像(Object)或者数组(Array)
目录
JavaScript数据拷贝类型
浅拷贝
深拷贝
举例:
浅拷贝
数组
对象
深拷贝
lodash cloneDeep使用示例
自定义深拷贝方法示例
JSON.parse() 和 JSON.stringify()使用示例
JavaScript数据拷贝类型
浅拷贝
数组可以使用Array.prototype.slice()方法
对象可以使用Object.assign()方法
深拷贝
数组和对象都可以使用第三方库lodash 的 _.cloneDeep()方法或者自己封装
或者JSON.parse() 和 JSON.stringify()
举例:
浅拷贝
数组
JavaScript 的 Array.prototype.slice()
方法对于数组来说是浅拷贝(shallow copy)。
当使用 slice()
方法时,它会创建一个新的数组,包含从开始到结束(不包括结束)的元素。然而,这个方法创建的新数组中的元素是原数组中元素的引用,而不是这些元素的副本。这意味着如果原数组中的元素是对象,那么新数组和对象仍然会引用相同的对象。因此,对于这种情况,slice()
实现的是浅拷贝。
例如:
let arr1 = [{ a: 1 }, { b: 2 }];
let arr2 = arr1.slice(); arr2[0].a = 2;
arr2[1] = { b: 3 }; console.log(arr1); // 输出:[{ a: 2 }, { b: 2 }]
console.log(arr2); // 输出:[{ a: 2 }, { b: 3 }]
slice无法实现深拷贝例子
对象
可以使用 Object.assign()
方法实现浅拷贝:
let original = {a: 1, b: 2, c: {d: 3}};
let copy = Object.assign({}, original);
深拷贝
lodash cloneDeep使用示例
_.cloneDeep()
是 Lodash 库中的一个函数,用于执行深拷贝(deep clone)操作。该函数会创建一个新的对象,复制源对象(source object)的所有值,包括嵌套的对象和数组。与浅拷贝(shallow clone)不同,深拷贝会递归地复制对象的所有层级,而不仅仅是第一层。
使用
_.cloneDeep()
可以确保源对象不会被修改,因为所有的值都被复制到了新的对象中。这在处理复杂数据结构时特别有用,尤其是当你不想改变原始数据,但又需要对其进行操作时
深拷贝例子
const _ = require('lodash'); const originalObject = { name: 'John', age: 30, address: { city: 'New York', country: 'USA' }
}; const clonedObject = _.cloneDeep(originalObject); console.log(clonedObject);
// 输出:{ name: 'John', age: 30, address: { city: 'New York', country: 'USA' } } // 修改克隆对象的属性值
clonedObject.name = 'Jane';
clonedObject.address.city = 'Los Angeles'; console.log(originalObject);
// 输出:{ name: 'John', age: 30, address: { city: 'New York', country: 'USA' } }
console.log(clonedObject);
// 输出:{ name: 'Jane', age: 30, address: { city: 'Los Angeles', country: 'USA' } }
自定义深拷贝方法示例
function getObjType(obj) {var toString = Object.prototype.toString;var map = {'[object Boolean]': 'boolean','[object Number]': 'number','[object String]': 'string','[object Function]': 'function','[object Array]': 'array','[object Date]': 'date','[object RegExp]': 'regExp','[object Undefined]': 'undefined','[object Null]': 'null','[object Object]': 'object'};return map[toString.call(obj)];
};
function cloneDeep(data) {var type = getObjType(data);var obj;if (type === 'array') {obj = [];} else if (type === 'object') {obj = {};} else {// 已到达最后一个层级return data;}if (type === 'array') {for (var i = 0, len = data.length; i < len; i++) {data[i] = function () {if (data[i] === 0) {return data[i];}return data[i] || {};}();delete data[i].$parent;obj.push(cloneDeep(data[i]));}} else if (type === 'object') {for (var key in data) {delete data.$parent;obj[key] = cloneDeep(data[key]);}}return obj;
};
JSON.parse() 和 JSON.stringify()使用示例
但需要注意的是,这种方法只适用于可序列化的对象,如果对象中包含函数、undefined 或者 symbol 类型,或者存在循环引用,则这种方法不能使用。
对于更复杂的深拷贝需求,可以使用到递归或者其他库如 lodash 的 _.cloneDeep() 方法。
相关文章:

JavaScript 如何拷贝对像(Object)或者数组(Array)
目录 JavaScript数据拷贝类型 浅拷贝 深拷贝 举例: 浅拷贝 数组 对象 深拷贝 lodash cloneDeep使用示例 自定义深拷贝方法示例 JSON.parse() 和 JSON.stringify()使用示例 JavaScript数据拷贝类型 浅拷贝 数组可以使用Array.prototype.slice()方法 …...

nodejs669在线图书借阅管理系统vue前端
系统的设计与实现主要实现角色有管理员和用户,管理员在后台管理用户模块、用户表模块、图书借阅模块、图书归还模块、图书分类模块、token表模块、收藏表模块、书籍信息模块、图书资讯模块、留言板模块、书籍信息评论表模块、注册用户模块、配置文件模块、处罚记录模块、在线客…...

计算机网络之概述
一、概述 1.1因特网概述 定义 网络(Network)由若干结点(Node)和连接这些结点的链路(Link)组成。多个网络还可以通过路由器互连起来,这样就构成了一个覆盖范围更大的网络,即互联网(或互连网)因此,互联网是“网络的网络…...
git stash save untracked not staged
git stash save untracked not staged 如图 解决方案: git stash save "tag标记信息" --include-untracked或者: git stash save -u "tag标记信息" git stash clear清空本地暂存代码_zhangphil的博客-CSDN博客文章浏览阅读486次。…...

spring-boot集成mybatis-generator
通用 Mapper 在 1.0.0 版本的时候增加了 MyBatis Generator (以下简称 MBG) 插件,使用该插件可以很方便的生成实体类、Mapper 接口以及对应的 XML 文件。 下面介绍了 mybatis-generator 在 spring-boot 中的使用过程 一、引入pom依赖 <dependencies><de…...

C++中用于动态内存的new和delete操作符
文章目录 1、动态分配内存的应用2、动态分配内存与分配给普通变量的内存有什么不同?3、C 中如何分配/释放内存4、new 操作符4.1 使用new的语法4.2 初始化内存4.3 分配内存块4.4 普通数组声明 Vs 使用new4.5 如果运行时没有足够内存可用怎么办? 5、delete 操作符 C/…...

什么是美颜sdk?集成第三方美颜sdk的步骤
本文将深入探讨如何集成第三方美颜sdk,为直播平台引入更先进、更具吸引力的美颜特效。 第一步:选择合适的第三方美颜sdk 在开始集成美颜sdk之前,首要任务是选择适合自己直播平台需求的第三方美颜sdk。不同的sdk可能具有不同的特色和性能&a…...
Gogs服务搭建及软件的使用
Gogs基本操作使用:https://blog.51cto.com/yangxingzhen/5980346 Gitea—私有git服务器搭建教程:https://huaweicloud.csdn.net/638db200dacf622b8df8c7f1.html?spm1001.2101.3001.6650.3&utm_mediumdistribute.pc_relevant.none-task-blog-2%7Edefault%7ECTR…...

Python基础语法之学习运算符
Python基础语法之学习运算符 一、代码二、效果 一、代码 print("1 1 ", 1 1) print("1 - 1 ", 1 - 1) print("1 * 1 ", 1 * 1) print("11 / 5 ", 11 / 5) print("11 // 5 ", 11 // 5) print("9 % 5 ", 9…...

freertos任务调度机制深度分析(以RISC-V架构为例)
1、前言 本文是以RISC-V架构为例进行讲解,在汇编代码层面和ARM架构不一样,但是整体框架是一样的侧重任务调度底层机制讲解,讲解代码只保留了基本功能,可配置的功能基本都已经删除本文是以可抢占式调度机制进行讲解RISC-V架构只支持…...

深入了解Spring Boot中@Async注解的8大坑点
文章目录 1. 缺少EnableAsync注解2. 异步方法需独立3. 不同的异步方法间无法相互调用4. 返回值为void的异步方法无法捕获异常5. 外部无法直接调用带有Async注解的方法6. Async方法不适用于private方法7. 缺失异步线程池配置8. 异步方法与事务的兼容结语 🎉深入了解S…...

C语言——深入理解指针(3)
目录 1. 字符指针 2. 数组指针 2.1 数组指针变量 2.2 数组指针变量的初始化 3.二维数组传参(本质) 4. 函数指针 4.1 函数指针变量的创建 4.2 函数指针的使用 4.3 typedef 5. 函数指针数组 6. 转移表(函数指针数组的使用ÿ…...

图书管理系统源码,图书管理系统开发,图书借阅系统源码配置和运行图解源码已附加
目录 配置简介和软件条件 数据库附件配置 vs应用程序web.config配置数据库链接字符串 数据库文件脚本代码 配置简介和软件条件 所需要的软件是Vs2017以上数据库是Sqlserver2012以上,如果数据库附件不了可以使用数据库脚本附件数据库脚本会在文章末尾写出来。可以…...

FFmpeg介绍
官方网站:http://www.ffmpeg.org/ 项目组成 libavformat 封装模块,封装了Protocol层和Demuxer、Muxer层,使得协议和格式对于开发者来说是透明的。FFmpeg能否支持一种封装格式的视频的封装与解封装,完全取决于这个库,…...
修改网卡PHY的灯-RK3568
文章目录 前言1.定制PHY的灯2.通过命令修改LED状态3.修改驱动效果前言 前面我们已经移植了网卡到开发板上面,也能够正常的进行通信,但是,我们会发现座子上面的灯并没有全部亮起来,而且这些灯的含义是什么,并没有讲解到,这里,就此问题,展开学习。 PHY 有一个重要的功能…...

11月29日作业
作业: 自己封装一个矩形类(Rect),拥有私有属性:宽度(width)、高度(height), 定义公有成员函数: 初始化函数:void init(int w, int h) 更改宽度的函数:set_w(int w) 更改高度的函数:set_h(int h) 输出该矩形的周长和面积函数:void show(…...

【从删库到跑路 | MySQL总结篇】表的增删查改(进阶下)
个人主页:兜里有颗棉花糖 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创 收录于专栏【MySQL学习专栏】🎈 本专栏旨在分享学习MySQL的一点学习心得,欢迎大家在评论区讨论💌 目录 一、联合…...

【机器学习 | 可视化系列】可视化系列 之 决策树可视化
🤵♂️ 个人主页: AI_magician 📡主页地址: 作者简介:CSDN内容合伙人,全栈领域优质创作者。 👨💻景愿:旨在于能和更多的热爱计算机的伙伴一起成长!!&…...
配置阿里云的yum仓库
目录 配置阿里云的yum源 清理官方yum源 下载阿里云的yum源 centos7下载阿里云yum源: 清理yum缓存:yum cleam all 生成自己的yum缓存:yum makecache 使用centos自带的官方yum源下载很慢,那今天来跟大家说说配置阿里云的yum仓…...
Kubernetes之kubeadm日志展示篇—K8S私有云worker节点gluster安装部署
文章目录 一. 服务器信息1.1 环境准备1.2 配置hosts解析记录 二. 安装与部署2.1 配置仓库 (所有节点)2.2 安装服务 (所有节点)2.3 启动服务 (所有节点)2.4 配置资源池 (主节点)2.5 创…...
基于算法竞赛的c++编程(28)结构体的进阶应用
结构体的嵌套与复杂数据组织 在C中,结构体可以嵌套使用,形成更复杂的数据结构。例如,可以通过嵌套结构体描述多层级数据关系: struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...
HTML 语义化
目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案: 语义化标签: <header>:页头<nav>:导航<main>:主要内容<article>&#x…...

调用支付宝接口响应40004 SYSTEM_ERROR问题排查
在对接支付宝API的时候,遇到了一些问题,记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...
java_网络服务相关_gateway_nacos_feign区别联系
1. spring-cloud-starter-gateway 作用:作为微服务架构的网关,统一入口,处理所有外部请求。 核心能力: 路由转发(基于路径、服务名等)过滤器(鉴权、限流、日志、Header 处理)支持负…...

label-studio的使用教程(导入本地路径)
文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...

《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)
CSI-2 协议详细解析 (一) 1. CSI-2层定义(CSI-2 Layer Definitions) 分层结构 :CSI-2协议分为6层: 物理层(PHY Layer) : 定义电气特性、时钟机制和传输介质(导线&#…...
【磁盘】每天掌握一个Linux命令 - iostat
目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat(I/O Statistics)是Linux系统下用于监视系统输入输出设备和CPU使…...
【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验
系列回顾: 在上一篇中,我们成功地为应用集成了数据库,并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了!但是,如果你仔细审视那些 API,会发现它们还很“粗糙”:有…...
Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?
在大数据处理领域,Hive 作为 Hadoop 生态中重要的数据仓库工具,其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式,很多开发者常常陷入选择困境。本文将从底…...

使用LangGraph和LangSmith构建多智能体人工智能系统
现在,通过组合几个较小的子智能体来创建一个强大的人工智能智能体正成为一种趋势。但这也带来了一些挑战,比如减少幻觉、管理对话流程、在测试期间留意智能体的工作方式、允许人工介入以及评估其性能。你需要进行大量的反复试验。 在这篇博客〔原作者&a…...