Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/376.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 创建新数组而不影响旧数组中的值_Javascript - Fatal编程技术网

Javascript 创建新数组而不影响旧数组中的值

Javascript 创建新数组而不影响旧数组中的值,javascript,Javascript,我正在尝试创建现有阵列的副本,并在不影响原始阵列的情况下从阵列副本中删除一些项。我试过这个: var new_arr = old_arr; //when I remove from new array the items from old array are also removed 如何创建现有阵列的全新副本 更新: 当我这样做时: var new_arr = old_arr.slice(); 随后: new_arr[0].shift(); new_arr[1].shift(); 将删除

我正在尝试创建现有阵列的副本,并在不影响原始阵列的情况下从阵列副本中删除一些项。我试过这个:

var new_arr = old_arr; //when I remove from new array the items from old array are also removed
如何创建现有阵列的全新副本

更新:

当我这样做时:

var new_arr = old_arr.slice();
随后:

new_arr[0].shift();
new_arr[1].shift();

将删除旧_数组中的项。这是一个二维数组。

您可以使用两种方法,即:

function clone (src) {
    return JSON.parse(JSON.stringify(src));
}
或者这个:

var newArray = oldArray.slice();

使用Yoshi answer,您可以扩展阵列原型(只是一个简单的助手):


要做到这一点,一个较新的解决方案是使用如下“from”:

const newArr = Array.from(oldArr);
但这是一个浅拷贝,如果嵌套元素发生变异,它们将投影到新创建的具有from的数组中。最好的解决办法是使用

const newArr = JSON.parse(JSON.stringify(oldArr));
但是,这种方法也不能保证所有这些。例如,如果数组的一个元素包含一个类似于n=>++n的函数,那么在使用JSON方法后它将为null,所以最好的解决方案是deepClone,对于这个完整的解释,我参考了


在Javascript中,二维数组只是数组的数组。因此,克隆一维是不够的。我们还需要克隆所有子维度数组。我们是这样做的:

函数克隆ID(网格){
//克隆第一个维度(列)
const newGrid=[…grid]
//克隆每行
forEach((行,行索引)=>newGrid[rowIndex]=[…行])
返回新网格
}
//网格是一个二维数组
常数网格=[[0,1],[1,2]]
newGrid=cloneGrid(网格)
log('原始网格',网格)
console.log('网格的克隆',newGrid)
log('它们引用的是同一个对象?',grid==newGrid)
---
原始网格[[0,1],[1,2]]
网格的克隆[[0,1],[1,2]]
它们指的是同一个对象?假的
或者,如果我们采取某种操作方式,我们可以使
cloneGrid
功能更加简单:

const cloneGrid = (grid) => [...grid].map(row => [...row])

要获得更详细的答案,请阅读

这里没有帮助,因为OP需要深度克隆。是的,你是对的,但伦敦后来更新了他的问题,即阵列是二维的。二维分析,是的,这正是你的解决方案没有帮助的原因。是的,这就是我的拼接没有帮助的原因。在伦敦更新他的问题之前,我发布了这个答案。哦,我明白了。您需要根据更新后的问题编辑答案或将其完全删除。与填充简单值的数组不同,您的数组是二维的,即填充了对象引用。使用
.slice()
克隆它将复制这些引用–但是
新的arr[0]
仍将引用与
旧的arr[0]
相同的对象。投票重新打开,因为它重复了另一个问题:@fanaugen那么我如何复制二维数组?@London请参阅下面@sourcecode的答案。使用jQuery和
JSON。stringify
深度克隆非常简单。为什么第一个解决方案需要jQuery?我喜欢使用JSON的方法,它非常简单漂亮!
const cloneGrid = (grid) => [...grid].map(row => [...row])