我有一个带有整数的二维数组,而我想要做的就是用数字增加一个特定的项目。 初始状态:
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处的所有数字?
答案 0 :(得分:3)
因为arr1
的每个元素都是 same 数组,所以对一个元素的更改就是对所有元素的更改。
答案 1 :(得分:0)
在将数组分配给变量时,并不是在复制数组。
let arr1 = [1,2,3];
let arr2 = arr1; // This does NOT create a copy of the array!
console.log(arr1[0]);
arr2[0] = "BOOM!"; // change arr2
console.log(arr1[0]); // displays "BOOM!" not 1 - arr1 is changed, too!
这是因为arr1
和arr2
都指向同一数组。
答案 2 :(得分:0)
尝试一下:
var arr1=[];
arr1.push([1,2,3]);
arr1.push([1,2,3]);
arr1.push([1,2,3]);
arr1[0][0]+=10;
那将给您想要的结果。
您的问题是,您对一个对象有3次相同的引用,并且当您更改该对象的值时,对该对象的所有引用都将显示更新后的值。
答案 3 :(得分:0)
运行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]);
答案 4 :(得分:0)
之所以发生这种情况,是因为您没有将grep -oE 'msm[0-9]+'
的副本推入arr2
,而是将了对arr1
的引用(指针),这意味着您正在重新编辑同一数组。
为避免这种情况,您应该使用spread。
执行arr2
代替arr1.push(arr2)
这是一个JSFiddle,输出:
arr1.push([...arr2])
答案 5 :(得分:0)
解释和理解的代码:
let MyArray_1 = [1,2,3,4];
let SameArray = MyArray_1;
SameArray[0] = 777;
console.log( 'MyArray_1 :', JSON.stringify ( MyArray_1 )); // changed.
console.log( 'SameArray :', JSON.stringify ( SameArray )); // no differences,
// MyArray_1 and SameArray are just 2 pointers for the same memory place of array values .
doSomething_1( MyArray_1, 1 );
console.log( 'MyArray_1 :', JSON.stringify ( MyArray_1 ));
function doSomething_1( ArrayArg, NoItem ) {
let not_insideArray = ArrayArg; // this is just a assign of the pointer on MyArray_1
not_insideArray[NoItem] = 999;
console.log( 'doSomething_1, not_insideArray :', JSON.stringify ( not_insideArray ));
}
解决方案=使用 Object.assign :
let MyArray_2 = [1,2,3,4];
let OtherArray = Object.assign( [], MyArray_2);
OtherArray[0] = 777;
console.log( 'MyArray_2 :', JSON.stringify ( MyArray_2 )); // not changed.
console.log( 'OtherArray :', JSON.stringify ( OtherArray )); // changed with new value
doSomething_2( MyArray_2, 2);
console.log( 'MyArray_2 :', JSON.stringify ( MyArray_2 ));
function doSomething_2(ArrayArg, NoItem )
{
let insideArray = Object.assign( [], ArrayArg ); // the real assign (and more) for JS Objects
insideArray[NoItem] = 999;
console.log( '_2, insideArray :', JSON.stringify ( insideArray ));
}
答案 6 :(得分:-1)
对象(数组也是对象)作为引用传递。这意味着您的数组如下所示(伪结构):
Option Explicit
Sub Main()
'Declaring [BD]
Dim oHeaderDictionary As New Scripting.Dictionary
Dim oThisSlider As Slider
Dim iLastRow As Long
Dim iRowIncrementer As Long
Dim sColumnHeaders As String
Dim sColumnStyles As String
'Initializing [BD]
Set oThisSlider = New Slider
Set oHeaderDictionary = New Scripting.Dictionary
Worksheets("Options").Activate
iLastRow = bpLastRow("B")
For iRowIncrementer = 3 To iLastRow
sColumnHeaders = Cells(iRowIncrementer, 2).Value
sColumnStyles = Cells(iRowIncrementer, 3).Value
oHeaderDictionary.Add sColumnHeaders, sColumnStyles
Next iRowIncrementer
MsgBox oHeaderDictionary.Items(1)
oThisSlider.Headers = oHeaderDictionary
MsgBox oThisSlider.Headers.Items(1)
End Sub
因此, arr2 -> [1, 2, 3]
arr1 -> [ -> arr2, -> arr2 -> arr2]
与arr1[0]
或arr1[1]
相同。要创建三个不同的数组,请复制该数组:
arr2