将JavaScript中的数组复制到另一个数组时:
var arr1 = ['a','b','c'];
var arr2 = arr1;
arr2.push('d'); //Now, arr1 = ['a','b','c','d']
我意识到arr2指的是与arr1相同的数组,而不是一个新的独立数组。如何复制阵列以获得两个独立的阵列?
将JavaScript中的数组复制到另一个数组时:
var arr1 = ['a','b','c'];
var arr2 = arr1;
arr2.push('d'); //Now, arr1 = ['a','b','c','d']
我意识到arr2指的是与arr1相同的数组,而不是一个新的独立数组。如何复制阵列以获得两个独立的阵列?
当前回答
当我在处理一系列深度嵌套的对象时,这些选项对我都不起作用。对于ES6,我发现这个解决方案很有用。
const old_array = [{name:"Nick", stats:{age:25,height:2}},{name:"June", stats:{age:20,height:2}}];
const new_array = old_array.map(e => {
if (e.name === 'June') {
e = { ...e };
e.stats = {...e.stats, age: 22};
}
return e;
});
只有new_array将受此影响。
其他回答
从ES2015开始,
var arr2 = [...arr1];
我个人更喜欢这种方式:
JSON.parse(JSON.stringify( originalObject ));
其中一些方法在处理简单的数据类型(如数字或字符串)时工作得很好,但当数组包含其他对象时,这些方法会失败。当我们试图将任何对象从一个数组传递到另一个数组时,它将作为引用传递,而不是对象。
在JavaScript文件中添加以下代码:
Object.prototype.clone = function() {
var newObj = (this instanceof Array) ? [] : {};
for (i in this) {
if (i == 'clone')
continue;
if (this[i] && typeof this[i] == "object") {
newObj[i] = this[i].clone();
}
else
newObj[i] = this[i]
} return newObj;
};
只需使用
var arr1 = ['val_1','val_2','val_3'];
var arr2 = arr1.clone()
这会奏效的。
基本体值始终按其值传递(复制)。但是,复合值是通过引用传递的。
那么我们如何复制这个arr?
let arr = [1,2,3,4,5];
在ES6中复制阵列
let arrCopy = [...arr];
在ES5中复制n阵列
let arrCopy = arr.slice();
let arrCopy = [].concat(arr);
为什么“let arrCopy=arr”不按值传递?
将一个变量传递给另一个复合值(例如“对象/数组”)会有不同的行为。在共和值上使用sign运算符,我们将引用传递给对象。这就是为什么在删除/添加arr元素时,两个数组的值都会发生变化。
例外情况:
arrCopy[1] = 'adding new value this way will unreference';
为变量指定新值时,将更改引用本身,而不会影响原始对象/数组。
阅读更多信息
以下是如何对可变深度的基元数组执行此操作:
// If a is array:
// then call cpArr(a) for each e;
// else return a
const cpArr = a => Array.isArray(a) && a.map(e => cpArr(e)) || a;
let src = [[1,2,3], [4, ["five", "six", 7], true], 8, 9, false];
let dst = cpArr(src);
https://jsbin.com/xemazog/edit?js安慰