JavaScript 如何拷贝对像(Object)或者数组(Array)

news2024/11/18 7:33:11

目录

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() 方法。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1233708.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

安卓毕业设计:基于安卓android微信小程序的超市购物系统

运行环境 开发语言&#xff1a;Java 框架&#xff1a;ssm JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09; 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&a…

C++纯虚函数和抽象类 制作饮品案例(涉及知识点:继承,多态,实例化继承抽象类的子类,多文件实现项目)

一.纯虚函数的由来 在多态中&#xff0c;通常父类中虚函数的实现是毫无意义的&#xff0c;主要都是调用子类重写的内容。例如&#xff1a; #include<iostream>using namespace std;class AbstractCalculator { public:int m_Num1;int m_Num2;virtual int getResult(){r…

2023-11-20 LeetCode每日一题(最大子数组和)

2023-11-20每日一题 一、题目编号 53. 最大子数组和二、题目链接 点击跳转到题目位置 三、题目描述 给你一个整数数组 nums &#xff0c;请你找出一个具有最大和的连续子数组&#xff08;子数组最少包含一个元素&#xff09;&#xff0c;返回其最大和。 子数组 是数组中的…

装机 - 12400F有必要换成13400F吗

想组个跑AI大模型的机器&#xff0c;预算5000左右。3090&#xff0c;4090玩不起&#xff0c;搞了个2080ti魔改22G的。 大佬们帮忙看看这个配置咋样&#xff0c;12400F有必要换成13400F吗。 感觉13400f多出的四个能效核除了跑分作用不大&#xff1f;网上看别人说大小核架构用win…

麒麟KYSEC使用方法03-开启及关闭netctl

原文链接&#xff1a;麒麟KYSEC使用方法03-开启及关闭netctl hello&#xff0c;大家好啊&#xff0c;今天给大家带来麒麟KYLINOS的kysec使用方法系列文章第三篇内容----使用命令开启及关闭netctl&#xff0c;联网控制策略有三种模式&#xff0c;off/enforing/warning&#xff0…

VsCode连接远程Linux编译环境的便捷处理

1.免输登录密码 免输命令的正确方法是使用公钥和私鈅在研发设备&#xff0c;和linux服务器上校验身份。公钥和私钥可在windows系统上生成。公钥要发送到linux服务器。私钥需要通知给本地的ssh客户端程序&#xff0c;相关的操作如下&#xff1a; 生成 SSH Key&#xff1a; 打开…

FCOS: Fully Convolutional One-Stage Object Detection 论文源代码复现

FCOS源代码github地址为&#xff1a; FCOS 这篇论文主要是关于目标检测的&#xff0c;今天跑一下它的实验&#xff0c;我是在autodl租的RTX 2080 Ti&#xff0c;因为这个代码比较久&#xff0c;所以Pytoch版本可能不可以装太高&#xff0c;我的镜像CUDA版本为10.1&#xff0c;…

深入 Django 的 URL 分发器

概要 在 Django 的 MVC 架构中&#xff0c;URL 分发器扮演着至关重要的角色&#xff0c;它负责将用户的请求路由到相应的视图函数或类。这一机制不仅保证了 Django 应用的高度可扩展性&#xff0c;还为开发者提供了灵活的 URL 设计能力。本文将详细介绍 Django 中的 URL 分发器…

线性表,但是是Java中数组实用使用!

线性表定义&#xff1a; 由n (n≥0)个数据特性相同的元素构成的有限序列称为线性表&#xff0c;(n0)的时候被称为空表。 线性表的顺序表示 线性表的顺序存储又被称为顺序表 优点 无需为表示表中元素之间的逻辑关系而增加额外的存储空间可以随意读取任意位置的元素 缺点 插入…

手把手教你通过CODESYS V3进行PLC编程(一)

教程背景 宏集MC系列模块化控制器是基于Raspberry Pi的高性能4核控制器&#xff0c;运动控制循环时间最快可达500微秒&#xff0c;实现了计算能力和成本之间的最佳平衡&#xff0c;适用于多轴运动控制和CNC控制。 教程目的 本系列教程将使用宏集MC系列控制器&#xff0c;详细…

极空间z2pro bitwarden+frp+nginx教程

z2pro Bitwarden Frp Nginx教程 本案例仅供记录 使用时按照自己的IP和端口进行 灵活变通 本案例中使用的设备&#xff1a; NAS&#xff1a;z2pro域名&#xff1a;est.xyz云服务器&#xff1a;腾讯云&#xff08;公网ip&#xff1a;43.43.43.143&#xff09; 一&#xff0c;Va…

Unity - 实现模型动态伸长缩短,贴图不变形(材质球参数篇)

思路为修改模型材质球的Tiling参数&#xff0c;根据与自身localScale的值得到合适的比例&#xff0c;再修改Tiling值 var mat target.transform.GetComponent<Renderer>().material; var oriValue mat.mainTextureScale;//沿着Y轴伸缩 oriValue.y 1 * target.transfo…

动手学深度学习(二)---线性回归

文章目录 1.线性回归从0实现2.线性回归简洁实现【相关方法】 1.线性回归从0实现 从0开始实现整个方法&#xff0c;包括数据流水线、模型、损失函数和小批量随机梯度下降优化器 &#xff08;1&#xff09;导入需要的包 % matplotlib inline import random import torch from d…

3分钟看完NVIDIA GPU架构及演进

近期随着 AI 市场的爆发式增长&#xff0c;作为 AI 背后技术的核心之一 GPU&#xff08;图形处理器&#xff09;的价格也水涨船高。GPU 在人工智能中发挥着巨大的重要&#xff0c;特别是在计算和数据处理方面。目前生产 GPU 主流厂商其实并不多&#xff0c;主要就是 NVIDIA、AM…

《研发效能 100 问》首发,多位专家解读「研效提升」的破局之道?

为了可以帮助更多研发管理者和研发效能负责人&#xff0c;了解构建研发效能体系应从何做起&#xff0c;以及在构建过程中需要解决哪些疑难问题&#xff0c;有哪些最佳实践可以借鉴。2023 年 7 月&#xff0c;思码逸发起&#xff0c;由行业知名研发效能专家张乐老师担任出品人&a…

【Skynet 入门实战练习】开发环境搭建 | 运行第一个项目 | debug console 简单使用

文章目录 写在前面开发环境搭建skynet配置文件项目&#xff0c;启动&#xff01; debug console 写在前面 本系列【Skynet 入门实战练习】所有源码同步&#xff1a;https://gitee.com/Cauchy_AQ/skynet_practice 开发环境搭建 skynet skynet 框架地址&#xff1a;https://g…

第7章-使用统计方法进行变量有效性测试-7.4.1-简单线性回归

目录 基本概念 变量之间的关系 相关分析 回归分析 相关分析和回归分析的关系 一元线性回归模型 总体回归函数 样本回归函数 线性回归模型的假定 普通最小二乘法&#xff08;Ordinary Least Squares&#xff0c;OLS&#xff09; 拟合优度指标 回归系数估计量的性质 …

主播-产品痛点话术

—、用户体验差我们的产品在用户体验方面存在一些问题。首先&#xff0c;产品的操作流程不够顺畅&#xff0c;导致用户在使用过程中经常遇到困扰。另外&#xff0c;我们的产品界面设计不够美观&#xff0c;无法给用户带来愉悦的使用体验。针对这些问题&#xff0c;我们将对产品…

2015-2020年全国地区生产总值及一二三产构成数据总览,shp/excel格式

今天我们来整理了2015-2020全国地区生产总值及一二三产构成数据&#xff0c;数据格式为shpexcel格式&#xff0c;数据精度可达各区县。 另外&#xff0c;需要说明的是&#xff1a;由于统计年鉴指标调整&#xff0c;每一年的数据并非字段相同&#xff0c;字段详情请参考已下载数…

KT142C语音芯片客户反馈电脑端的配置文件,打开都正常,但是拷贝到KT142C内部就乱码

KT142C语音芯片客户反馈电脑端的配置文件&#xff0c;打开都正常&#xff0c;但是拷贝到KT142C内部就乱码 首先解释一下原理&#xff0c;KT142C内置的330Kbyte空间可供用户下载&#xff0c;实际上拿出程序部分的空间 作为声音存储介质的&#xff0c;也就是说&#xff0c;代码空…