JS-数组拷贝

作者: 爱学习的小仙女早睡早起 | 来源:发表于2022-01-11 15:19 被阅读0次

数组复制(浅拷贝)

数组是复合的数据类型,直接复制的话,只是复制了指向底层数据结构的指针,而不是克隆一个全新的数组。

const a=[1,1]
const b=a
b[0]=2
console.log(a) // [2,1]



通常我们说的数组拷贝,是指的深拷贝


深拷贝实现方式

1、JSON.parse & JSON.stringify(深拷贝)

    let a=new Array(5).fill(1)
    const e=JSON.parse(JSON.stringify(a))  // 深拷贝
    e[0]=2
    console.log(a) // [1, 1, 1, 1, 1]

    const ab=[[1],[1,2]]
    const ac=JSON.parse(JSON.stringify(ab)) 
    ac[0].push(3)
    console.log(ab) // [[1],[1,2]]

2、手写递归深拷贝函数

深拷贝:一层一层地拷贝,利用递归来实现每一层都重新创建对象结构或数组结构并赋值。

深拷贝拷贝了数据(不再是拷贝地址),改变数据不再相互影响。

function deepClone(oldData, target){
      for(let i in oldData){
        let item=oldData[i]
        if(item instanceof Object){
          target[i]={}
          deepClone(item, target[i])  // //递归调用deepClone,一个个拷贝
        }else if(item instanceof Array){
          target[i]=[]
          deepClone(item, target[i])
        }else{
          target[i]=item
        }
      }
      return target
    }

3、封装快速调用的深拷贝函数

function deepClone(obj) {
  var newObj = obj instanceof Array ? [] : {}
  for (var i in obj) {
    newObj[i] = typeof obj[i] === 'object' ? deepClone(obj[i]) : obj[i]

  }
  return newObj
}

// 使用
var copyState = deepClone(state) // 拷贝state对象

---------- 以下方法对不包含引用对象的一维数组是深拷贝,对多维数组是浅拷贝

1、扩展运算符(浅拷贝)

    let a=new Array(5).fill(1)
    const d=[...a] 
    d[0]=2
    console.log(a)  // [1, 1, 1, 1, 1]    对一维是深拷贝

    let ab=[[1],[1]]
    const e=[...ab]
    e[0].push(2)
    console.log(ab)  // [[1, 2],[2]]   对多维是浅拷贝

2、map方法 (浅拷贝)

    console.clear()
    a=new Array(5).fill(1)
    const f=a.map( item=> item)
    f[0]=2
    console.log(a) // [1, 1, 1, 1, 1]   对一维是深拷贝

    let ab=[[1],[2]]
    const fb=ab.map( item=> item)
    fb[0].push(2)
    console.log(ab)  // [[1, 2],[2]]   对多维是浅拷贝

3、concat方法

    let a=new Array(5).fill(1)
    const c=new Array.concat(a) 
    c[0]=2
    console.log(a)  // [1, 1, 1, 1, 1]  对不包含引用对象的一维数组是深拷贝

    const ab=[[1],[1]]
    const cb=new Array.concat(ab)
    cb[0].push(2)
    console.log(ab)   // [[1, 2],[2]]   对多维是浅拷贝

    const ac=[{name:11}]
    const ad=new Array.concat(ac)
    ad[0].name=222
    console.log(ac) // [{name: 222}] 

4、Array.from

Array.from 可以将任何可迭代对象转换为数组。给一个数组返回一个浅拷贝。

    a=new Array(5).fill(1)
    const c= Array.from(a)
    c[0]=2
    console.log(a)  // [1, 1, 1, 1, 1]  对一维是深拷贝

    const ab=[[1],[1]]
    const cb= Array.from(ab)
    cb[0].push(2)
    console.log(ab)  // [[1, 2],[2]]   对多维是浅拷贝

相关文章

  • JS-数组拷贝

    数组复制(浅拷贝) 数组是复合的数据类型,直接复制的话,只是复制了指向底层数据结构的指针,而不是克隆一个全新的数组...

  • JS-数组中元素深拷贝

    数组A中数据放入数组B,修改B中的元素后,A中元素也改变了,是因为使用了浅拷贝。若使用深拷贝复制数组,便可解决此问...

  • 关于几个拷贝的问题

    数组浅拷贝 数组深拷贝 复合数组深拷贝

  • 浅拷贝与深拷贝

    /*浅拷贝:拷贝地址*/ /*深拷贝:拷贝对象*/ 用Strong修饰不可变数组:浅拷贝 用Copy修饰不可变数组...

  • 11_聊一聊js中实现数组拷贝的常用方法

    一、数组赋值 1、要点 用数组直接赋值的方式实现数组的拷贝,改变拷贝后的数组的元素,被拷贝的数组的元素也会发生改变...

  • js-深拷贝&&浅拷贝

    https://www.cnblogs.com/echolun/p/7889848.html[https://ww...

  • lodash中常用的方法

    lodash会拷贝一份新数组,不会对之前的数组进行影响 数据的基础处理 浅拷贝&&深拷贝 数组的分割,将数组(ar...

  • Javascript深拷贝

    什么是深拷贝 创建一个新的对象或数组时,将原对象/数组的“值”拷贝,而不是“引用”。 深拷贝 数组拷贝不存在多层嵌...

  • javascript 杂记

    数组杂记 1)数组的判断,使用Array.isArray() 2)一维数组的深拷贝 3)多维数组的深拷贝 4)数组...

  • JS-深拷贝

    增强版: 曾经版:

网友评论

    本文标题:JS-数组拷贝

    本文链接:https://www.haomeiwen.com/subject/nobmcrtx.html