Javascript二维数组:递增特定项';s值

Javascript二维数组:递增特定项';s值,javascript,arrays,Javascript,Arrays,我有一个二维数组,带有整数,我想要的就是用一个数字增加一个特定的项。 初始状态: var arr1=[]; var arr2=[1,2,3]; arr1.push(arr2); arr1.push(arr2); arr1.push(arr2); arr1现在看起来像这样: 0:[1, 2, 3] 1:[1, 2, 3] 2:[1, 2, 3] 我想让这个数组的[0,0]元素增加10,所以arr1应该是: 0:[11, 2, 3] 1:[1, 2, 3] 2:[1, 2, 3] 我所做的:

我有一个二维数组,带有整数,我想要的就是用一个数字增加一个特定的项。 初始状态:

var arr1=[];
var arr2=[1,2,3];
arr1.push(arr2);
arr1.push(arr2);
arr1.push(arr2);
arr1现在看起来像这样:

0:[1, 2, 3]
1:[1, 2, 3]
2:[1, 2, 3]
我想让这个数组的[0,0]元素增加10,所以arr1应该是:

0:[11, 2, 3]
1:[1, 2, 3]
2:[1, 2, 3]
我所做的:

arr1[0][0]+=10;
但这样做的结果是:

0:[11,2,3]
1:[11,2,3]
2:[11,2,3]

我错过了什么?为什么要将该命令中数组元素位置0处的所有数字递增?

因为
arr1
的每个元素都是同一个数组,所以对一个元素的更改就是对所有元素的更改。

当您将数组赋给变量时,您没有制作数组的副本

让arr1=[1,2,3];
设arr2=arr1;//这不会创建阵列的副本!
console.log(arr1[0]);
arr2[0]=“轰!”;//更改arr2
console.log(arr1[0]);//显示“BOOM!”而不是1-arr1也已更改对象(数组也是对象)作为引用传递。这意味着您的数组如下所示(伪结构):

因此
arr1[0]
arr1[1]
arr2
完全相同。要创建三个不同的阵列,请复制阵列:

 arr1.push([...arr2]);
试试这个:

var arr1=[];
arr1.push([1,2,3]);
arr1.push([1,2,3]);
arr1.push([1,2,3]);

arr1[0][0]+=10;
这会给你想要的结果


您的问题是,您对一个对象有三次相同的引用,当您更改该对象的值时,对该对象的所有引用都将显示更新的值。

当您运行
var arr2=[1,2,3],它将实例化一个对象并将其分配给
arr2

当您运行
arr1.push(arr2)
时,您正在推送到分配给
arr2
的对象的引用

换句话说,
arr1[0]==arr1[1]==arr1[2]

你需要做的是

var arr1=[];
arr1.push([1,2,3]);
arr1.push([1,2,3]);
arr1.push([1,2,3]);

发生这种情况的原因不是将
arr2
的副本推入
arr1
,而是指向
arr2
的引用(指针),这意味着您正在重新编辑同一数组

为了避免这种情况,您应该使用

而不是
arr1.push(arr2)
do
arr1.push([…arr2])

下面是一个具有输出的示例:

0: Array(3) [ 11, 2, 3 ]
​
1: Array(3) [ 1, 2, 3 ]
​
2: Array(3) [ 1, 2, 3 ]

在将arr2放入arr1之前,您应该制作一份arr2的副本…因为所有元素arr1都包含相同的对象:arr2。是的,谢谢,现在我知道了…:-)谢谢,这解决了我的问题,再次,学到了一些新东西…:-)好的,我知道了,但是我必须推送到arr1的数据是for循环的结果,该循环填充了arr2,一旦完成,我必须把它推到arr1。这部分知识缺失,只有一个引用会以这种方式推送到arr1,这就是为什么[0,0]值不仅会递增,如果我按照我所描述的方式来做……在您的循环中,请确保为arr2创建一个全新的数组。在向循环中添加值之前,必须在循环中调用
arr2=[]
,如执行
arr2[0]=1
arr2[1]=2
,等等。如果不调用
arr2=[]
,则它将永远不会创建新的数组对象,它只会通过覆盖数组中的现有值来重用同一数组。谢谢,此语法(扩展)对我来说是新的,但现在我知道了…:-)
0: Array(3) [ 11, 2, 3 ]
​
1: Array(3) [ 1, 2, 3 ]
​
2: Array(3) [ 1, 2, 3 ]