Javascript二维数组:增加特定项目的值

时间:2018-12-07 22:15:00

标签: 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]

我做了什么:

arr1[0][0]+=10;

但是这样的结果是:

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

我想念什么?为什么要用此命令递增数组元素位置0处的所有数字?

7 个答案:

答案 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!

这是因为arr1arr2都指向同一数组。

答案 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