当前位置: 首页 > news >正文

JS中常用的数组拷贝技巧

我们都知道,数组也是属于对象,在JS中对象的存储方式则是引用的方式。我们想要拷贝一个数组,就不能只是变量之前的赋值拷贝,这样他们将共享同一个引用,而数组又具有可变性,所以无法将原数组和拷贝的数组的数据分隔开。那么接下来将介绍如何对数据进行深层拷贝,使得原数组和拷贝数组的数据分隔开来。

浅拷贝

1.展开运算符

只支持简单结构的拷贝

    let number = [1, 2, 3, 4, 5]let copy = [...number]copy.push(0)console.log('copy', copy)//[1, 2, 3, 4, 5, 0]console.log('number', number)//[1, 2, 3, 4, 5]let arr = [{name: 'zhangsan',age: 18},{name: 'lisi',age: 19}]let copyArr = [...arr]copyArr[0].name = 'wangwu'console.log('copyArr', copyArr)//[ { name: 'wangwu', age: 18 }, { name: 'lisi', age: 19 } ]console.log('arr', arr)//[ { name: 'wangwu', age: 18 }, { name: 'lisi', age: 19 } ]

2.Array.concat方法

只支持简单结构的拷贝

  const number = [1, 2, 3, 4, 5]const copy = number.concat()copy.push(0)console.log('copy', copy)//[1, 2, 3, 4, 5, 0]console.log('number', number)//[1, 2, 3, 4, 5]const arr=[{name:'zhangsan',age:18},{name:'lisi',age:19}]let arrCopy=arr.concat()arrCopy[0].name='wangwu'console.log('arrCopy',arrCopy)//[ { name: 'wangwu', age: 18 }, { name: 'lisi', age: 19 } ]console.log('arr',arr)//[ { name: 'wangwu', age: 18 }, { name: 'lisi', age: 19 } ]

深拷贝

1.JSON.parse(JSON.stringify(arr))

支持简单结构和复杂结构的深层拷贝

  let number=[1,2,3,4,5]let copy=JSON.parse(JSON.stringify(number))copy.push(0)console.log('copy',copy)//[1, 2, 3, 4, 5, 0]console.log('number',number)//[1, 2, 3, 4, 5]const arr=[{name:'zhangsan',age:18},{name:'lisi',age:19}]let arrCopy=JSON.parse(JSON.stringify(arr))arrCopy[0].name='wangwu'console.log('arrCopy',arrCopy)//[ { name: 'wangwu', age: 18 }, { name: 'lisi', age: 19 } ]console.log('arr',arr)//[ { name: 'zhangsan', age: 18 }, { name: 'lisi', age: 19 } ]

2. Array.slice方法

支持简单结构和复杂结构的深层拷贝

    let numbers=[1,2,3,4,5]let numbersCopy=numbers.slice()numbersCopy.push(6)console.log('numbersCopy',numbersCopy)//[1, 2, 3, 4, 5, 6]console.log('numbers',numbers)//[1, 2, 3, 4, 5]let arr=[{name:'zhangsan',age:18},{name:'lisi',age:19}]let arrCopy=arr.slice()arrCopy.push({name:'wangwu',age:20})console.log('arrCopy',arrCopy)//[ { name: 'zhangsan', age: 18 }, { name: 'lisi', age: 19 }, { name: 'wangwu', age: 20 } ] console.log('arr',arr)//[ { name: 'zhangsan', age: 18 }, { name: 'lisi', age: 19 } ]

3.Array.map方法

支持简单结构和复杂结构的深层拷贝

    let numbers=[1,2,3,4,5,8]let copy=numbers.map(item=>item)copy.push(9)console.log('copy',copy)//[1, 2, 3, 4, 5, 8, 9]console.log('numbers',numbers)//[1, 2, 3, 4, 5, 8]const arr=[{name:'zhangsan',age:18},{name:'lisi',age:19}]const arrCopy=arr.map(item=>item)arrCopy.push({name:'wangwu',age:20})console.log('arrCopy--',arrCopy)//[ { name: 'zhangsan', age: 18 }, { name: 'lisi', age: 19 }, { name: 'wangwu', age: 20 } ]console.log('arr--',arr)//[ { name: 'zhangsan', age: 18 }, { name: 'lisi', age: 19 } ]

Array.from方法

支持简单结构和复杂结构的深层拷贝

    const number=[1,2,3,4,5]const copy=Array.from(number)copy.push(10)console.log('copy',copy)//[1, 2, 3, 4, 5, 10]console.log('number',number)//[1, 2, 3, 4, 5]let arr=[{hobby:'xxx',age:18},{hobby:'yyy',age:19}]const arrCopy=Array.from(arr)arrCopy.push({hobby:'zzz',age:20})console.log('arrCopy',arrCopy)//[ { hobby: 'xxx', age: 18 }, { hobby: 'yyy', age: 19 }, { hobby: 'zzz', age: 20 } ]console.log('arr',arr)//[ { hobby: 'xxx', age: 18 }, { hobby: 'yyy', age: 19 } ]

http://www.lryc.cn/news/113028.html

相关文章:

  • SAP ABAP程序性能优化-养成良好的代码习惯
  • SQL SERVER ip地址改别名
  • 数据结构-1
  • Java自定义校验注解实现List、set集合字段唯一性校验
  • xiaoweirobot.chat
  • 【无公网IP】本地电脑搭建个人博客网站(并发布公网访问 )和web服务器
  • SpringCloud(29):Nacos简介
  • freeBSD - 笔记
  • 【Linux】网络基础——宏观认识计算机网络
  • 数字人现身大运会,怎么以动作捕捉技术助推运动与文博相结合
  • WSL安装
  • MongoDB 入门
  • 使用uni-app的uniCloud 云数据库入门:实现一个简单的增删改查
  • 【MATLAB第64期】【保姆级教程】基于MATLAB的SOBOL全局敏感性分析模型运用(含无目标函数,考虑代理模型)
  • Python web实战之Django用户认证详解
  • 每天五分钟机器学习:梯度下降算法和正规方程的比较
  • 生信学院|08月18日《基于Flow Simulation的冷链运输产品案例》
  • 不可错过的家装服务预约小程序商城开发指南
  • 任务 13、MidJourney种子激发极致创作,绘制震撼连贯画作
  • IAR开发环境的安装、配置和新建STM32工程模板
  • FPGA优质开源项目 – PCIE通信
  • NLP:长文本场景下段落分割(文本分割、Text segmentation)算法实践----一种结合自适应滑窗的文本分割序列模型
  • 商汤科技2021校招-开发大类B卷
  • 陪诊小程序开发|陪诊系统定制|数字化医疗改善就医条件
  • stable diffusion(1): webui的本地部署(windows)
  • (树) 剑指 Offer 36. 二叉搜索树与双向链表 ——【Leetcode每日一题】
  • TypeScript初学
  • C/C++预定义宏
  • 原型链污染挖掘(存储XSS)
  • Chrome开发者工具介绍