按值复制数组及其所有元素

时间:2018-08-28 09:36:31

标签: angular typescript

我正在尝试复制一个数组及其所有元素,但是我没有得到它。

我有一个带有名称和选项的模型,都包含字符串

这就是我所拥有的:

const myArrayToCopy = [myModel, myModel, myModel]

我要复制的是:

const copy = Object.assign([],myArrayToCopy);
console.log(copy === myArrayToCopy) //false
console.log(copy[0] === myArrayToCopy[0]) //true -> bad

然后我尝试了

copy[0] = Object.assign(myArrayToCopy[0]) 
//still true

我该怎么办?

6 个答案:

答案 0 :(得分:4)

我建议使用深层副本,例如lodash提供的内容:

import * as _ from "lodash";
let copy_array = _.cloneDeep( myArrayToCopy);

方便之处在于它可以推广到任何深度。

答案 1 :(得分:0)

可能的解决方案是

const copy = myArrayToCopy.map(o => ({...o}))

copy === myArrayToCopy // false
copy[0] === myArrayToCopy[0] // false

答案 2 :(得分:0)

let myCopy = myArrayToCopy.map((elem) => Object.assign({}, elem));

根据documentation,Object.assign将所有属性从第二个参数复制到第一个参数。

正如学习混乱所指出的那样,该解决方案不适用于复杂的对象(即嵌套对象)。

答案 3 :(得分:0)

这是所有可能性

const myArrayToCopy = [myModel, myModel, myModel];
const sameMemReference = myArrayToCopy; // Same memory reference
const newMemReference = [...myArrayToCopy]; // Different memory reference, but same for the objects
const  totalMemDifference = [...myArrayToCopy.map(obj => ({...obj}))]; // total memory difference

总结:

  • 更改sameMemReference,第一个数组更改。
  • 更改newMemReference,您的数组不变
    • 更改其中的对象,第一个数组中的对象更改
  • totalMemDifference中更改所需内容,这不会影响您的第一个数组。

答案 4 :(得分:0)

您可以将JSON.parse和JSON.stringify用于对象的深层复制。

RecyclerView

答案 5 :(得分:0)

对于深层复制,您可以执行以下操作:

copy = JSON.parse(JSON.stringify(myArrayToCopy))