使用扩展运算符克隆带有数组的对象

Posted

技术标签:

【中文标题】使用扩展运算符克隆带有数组的对象【英文标题】:Clone Object with arrays using spread operator 【发布时间】:2018-03-31 20:36:04 【问题描述】:

如何使用新的扩展运算符克隆一个包含数组的对象?

示例对象:

vehicles:  
  cars:  [1, 2],
  boats: [3, 4]

我想要一个包含数组的新对象。在那个新对象中,我希望能够在不引用和影响车辆对象的情况下更改或添加到数组中。

【问题讨论】:

你能指定你的新对象的内容吗? 扩展运算符制作浅拷贝,因此不幸的是仍然会引用任何深层对象。 这能回答你的问题吗? How to Deep clone in javascript 【参考方案1】:

如果您正在寻找性能,使用 JSON.parse(JSON.stringify(object)) 进行深拷贝和对象不是最好的方法,而是使用这样的深拷贝:

let x1 = 
  numbers: 
    number: 1
  

let y1 = copy(x1)
x1.numbers.number++
  console.log(x1)
console.log(y1)

function copy(aObject)  // Deep Clone Object from https://***.com/a/34624648/16642626
  if (!aObject) 
    return aObject;
  

  let v;
  let bObject = Array.isArray(aObject) ? [] : ;
  for (const k in aObject) 
    v = aObject[k];
    bObject[k] = (typeof v === "object") ? copy(v) : v;
  

  return bObject;

【讨论】:

【参考方案2】:

Object.assign 和扩展运算符创建浅克隆,只有一层深,超出了它们的引用。我发现的最好方法(感谢MDN)是使用 JSON 函数来创建真正的克隆。

let vehicles =  
  cars:  [1, 2],
  boats: [3, 4],
;

let test = JSON.parse(JSON.stringify(vehicles));

console.log(vehicles, test);

test.cars[0] = 5;
vehicles.cars[0] = 7;

console.log(vehicles, test);

【讨论】:

很好的解决方案! 如果你有大对象怎么办?在那种情况下它会处理吗? 我不明白为什么不这样做,如果你有一个大的单级对象我建议使用 Object.assign,(个人意见)我认为最好使用内置的语言函数,当他们将完成这项工作。对于大型多级对象,此方法可以正常工作。 似乎不适用于更深的属性具有数组的对象。数组总是空白 我刚刚在控制台(chrome 67)中使用深度嵌套的数组和对象重新测试了这个,没有遇到这个问题。您能否粘贴您的示例对象,以及您使用的是哪个操作系统和浏览器? :) 乐于帮助调试

以上是关于使用扩展运算符克隆带有数组的对象的主要内容,如果未能解决你的问题,请参考以下文章

ES6 扩展运算符

Babel 无法使用扩展运算符编译 ES6 对象克隆

JS使用扩展运算符克隆对象并更改一个字段[重复]

ES6 丨数组的扩展

在对象数组上使用扩展运算符来访问元素[重复]

如何使用扩展运算符将对象数组推入特定元素