包含对象的复杂数组深拷贝

let arr = [
    {name: 'Bob', age: 12},
    {name: 'Lucy', age: 10},
    {name: 'Alix', age: 11}
]

let arr1 = [...arr]
arr1[0].age = 99

console.log(arr[0].age) // 99

显而易见:es6 的这种拷贝数组方法不合适,因为 arr 里的都是对象,那现在问题就是如何深拷贝 arr 这个数组?

阅读 8.3k
4 个回答

为什么不用lodash的深度克隆技术?一行代码搞定,优雅直观:

let arr1 = _.cloneDeep(arr);

Emmmm,最简单的办法嘛...

arrCopy = JSON.parse(JSON.stringify(arr))

复杂一点的话,自己写一个递归咯。

递归调用浅拷贝吧。

  function deepCopy(p, c) {
    var c = c || {};
    for (var i in p) {
      if (typeof p[i] === 'object') {
        c[i] = (p[i].constructor === Array) ? [] : {};
        deepCopy(p[i], c[i]);
      } else {
         c[i] = p[i];
      }
    }
    return c;
  }

这种应当算解构赋值吧,简单点理解就是arr1[0] = arr[0],arr1[1]=arr[1]...所以应当是个引用赋值,浅的不行。用JSON拷贝的话,对象的方法复制不出去。可以试一下map结合assign,或者递归复制

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题