将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相同的数组,而不是一个新的独立数组。如何复制阵列以获得两个独立的阵列?
当前回答
我发现这种方法比较容易:
设arr=[1,2,3,4,5];让newArr=[…arr];console.log(newArr);
其他回答
其中一些方法在处理简单的数据类型(如数字或字符串)时工作得很好,但当数组包含其他对象时,这些方法会失败。当我们试图将任何对象从一个数组传递到另一个数组时,它将作为引用传递,而不是对象。
在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()
这会奏效的。
丹,没必要耍花样。你所需要做的就是通过这样做复制arr1。
var arr1=[‘a’,‘b’,‘c’];var arr2=[];var arr2=新数组(arr1);arr2.推送('d');//现在,arr2=[['a','b','c'],d']console.log('arr1:');控制台日志(arr1);console.log('arr2:');控制台日志(arr2);//以下是诀窍:var arr3=[…arr1];arr3.推送('d');//现在,arr3=[‘a’,‘b’,‘c’,‘d’];console.log('arr3:');控制台日志(arr3);
现在arr1和arr2是存储在单独堆栈中的两个不同数组变量。在jsfiddle上看看这个。
正如我们在Javascript中所知道的那样,数组和对象都是通过引用的,但是我们可以用什么方法复制数组而不改变后面的原始数组呢?
这里有几种方法:
假设我们在您的代码中有这个数组:
var arr = [1, 2, 3, 4, 5];
1) 在函数中循环数组并返回一个新数组,如下所示:
function newArr(arr) {
var i=0, res = [];
while(i<arr.length){
res.push(arr[i]);
i++;
}
return res;
}
2) 使用slice方法,slice用于对数组的一部分进行切片,它将在不接触原始数组的情况下对数组的某些部分进行切片。在切片中,如果不指定数组的开始和结束,它将对整个数组进行切片,并基本上制作数组的完整副本,因此我们可以很容易地说:
var arr2 = arr.slice(); // make a copy of the original array
3) 还有contact方法,这是用于合并两个数组,但我们可以只指定其中一个数组,然后这基本上会复制新接触数组中的值:
var arr2 = arr.concat();
4) 另外,不建议使用stringify和parse方法,但这是复制Array和Objects的一种简单方法:
var arr2 = JSON.parse(JSON.stringify(arr));
5) Array.from方法,这不受广泛支持,使用前请检查不同浏览器中的支持:
const arr2 = Array.from(arr);
6) ECMA6方式,也不完全支持,但babelJs可以帮助您,如果您想转换:
const arr2 = [...arr];
您可以使用阵列排列。。。复制阵列。
const itemsCopy=[…items];
此外,如果要创建一个新数组,现有数组是其中的一部分:
var parts = ['shoulders', 'knees'];
var lyrics = ['head', ...parts, 'and', 'toes'];
现在所有主流浏览器都支持数组排列,但如果您需要更旧的支持,请使用typescript或babel并编译到ES5。
有关点差的更多信息
重要的
这里的大多数答案适用于特定情况。
如果您不关心深度/嵌套对象和道具,请使用(ES6):
let clonedArray=[…array]
但如果要进行深度克隆,请改用以下方法:
let cloneArray=JSON.parse(JSON.stringify(数组))*
*函数在使用stringify时不会被保存(序列化),如果没有它们,您将得到结果。
对于lodash用户:
let clonedArray=_.clone(数组)文档
and
let cloneArray=_.cloneDeep(数组)文档