others - Javascript - 按value复制数组

96 2

将array中的复制到另一个array时:


var arr1 = ['a','b','c'];


var arr2 = arr1;


arr2.push('d'); //Now, arr1 = ['a','b','c','d']



我意识到arr2引用的数组与arr1相同,而不是一个新的独立数组,如何复制数组以获得两个独立数组?

时间: 原作者:

118 2

使用这个:


var newArray = oldArray.slice();



基本上,slice()是克隆数组,并且返回对新数组的引用,还请注意:

对于引用,字符串和数字(而不是真正的对象),slice()将对象引用复制到新数组中,原始数组和新数组都引用相同的对象,如果引用的对象更改,则新数组和原始数组对这些更改都是可见的。

字符串和数字等原语是不可变的,因此不可能更改字符串或数字。

原作者:
136 3

你可以使用数组传播...来复制数组。

const itemsCopy = [...items];

如果想要创建一个新数组,并且现有数组是其中的一部分:


var parts = ['shoulders', 'knees'];


var lyrics = ['head', ...parts, 'and', 'toes'];



数组spreads现在是在所有主流浏览器中支持,但是如果需要较老的支持,使用typeScript或babel,并且编译到ES5.

有关spreads的更多信息

原作者:
124 1

不需要jQuery ,工作示例


var arr2 = arr1.slice()



从起始位置0到数组末尾的数组复制。

如果你有引用类型的数组,请参见类型Object会复制数组,但是,两个数组都会包含对同一Object的引用,所以,在这种情况下,即使数组实际被复制,看起来像是通过引用复制数组。

原作者:
91 3

尝试多种方法后,我就这样做了:


var newArray = JSON.parse(JSON.stringify(orgArray));



这会创建一个与第一个无关的新深拷贝(不是浅拷贝)。

这显然不会克隆事件和函数,但是,你可以在一行中做到这一点,它可以用于任何类型的对象(数组,字符串,数字,对象......),

原作者:
109 5

我个人认为Array.from是一种更具可读性的解决方案,顺便说一下,小心它的浏览器支持。


//clone


let x = [1,2,3];


let y = Array.from(x);



//deep clone


let clone = arr => Array.from(arr,item => Array.isArray(item) ? clone(item) : item);


let x = [1,[],[[]]];


let y = clone(x);



原作者:
86 0

重要!

这里的大多数答案适用于特定情况。

如果你不关心深层/嵌套对象和道具,请使用(ES6 ):

let clonedArray = [...array]

但是,如果要进行深层克隆,请使用此方法:

let cloneArray = JSON.parse(JSON.stringify(array))

对于Lodash用户:

let clonedArray = _.clone(array)文稿

let clonedArray = _.cloneDeep(array)文稿

原作者:
90 2

如果你在ecmascript 6的环境中,使用 Spread运算符可以这样做:


var arr1 = ['a','b','c'];


var arr2 = [...arr1]; //copy arr1


arr2.push('d');



console.log(arr1)


console.log(arr2)
<script src="http://www.wzvang.com/snippet/ignore_this_file.js"></script>

原作者:
...