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)
doarr1.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 ]