奇怪的javascript数组行为.它能修好吗

Odd javascript array behaviour. Can it be fixed?

本文关键字:javascript 数组      更新时间:2023-09-26

我有一个多维数组,如下所示:

var map = [[0,0,0,0,0],[0,0,0,0,0],[0,0,0,0,0],[0,0,0,0,0],[0,0,0,0,0]];

然后,我有一些函数可以根据一些变量在两个维度上"调整"数组的大小。我就是这样做的:

function resizeArr(arr, rows, rowsDiff, cols, colsDiff) {
    var arrLength = arr.length;
    if (colsDiff > 0) {
        i=0;
        while (i<arrLength) {
            j=0;
            while (j<colsDiff) {
                arr[i].push(0);
                j++
            }
            i++
        }
    }
    if (colsDiff < 0) {
        i=0;
        while (i<arrLength) {
            j=0;
            colsDiffAbs = Math.abs(colsDiff);
            while (j<colsDiffAbs) {
                arr[i].pop();
                j++
            }
            i++
        }
    }
    if (rowsDiff > 0) {
        fullColsArr = makeArrayOf(0, cols);
        i=0;
        while (i<rowsDiff) {
            arr.push(fullColsArr);
            i++
        }
    }
    if (rowsDiff < 0) {
        rowsDiffAbs = Math.abs(rowsDiff);
        i=0;
        while (i<rowsDiffAbs) {
            arr.pop();
            i++
        }
    }
    return arr;
}

基本上,对于这4个if语句,我会弹出一些值或推送一些新的1(零),这取决于rowsDiff/colsDiff变量是正还是负。

我的问题是,当我将数组从最大值map[4][4]调整为map[9][9]时,看起来一切都很好,因为我得到了:

[[0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0]] 

作为我的新数组,看起来不错。然而,当我试图为map[9][9]分配一个特定的值时,它会填充每个新数组的最后一个值,如下所示:

[[0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,14],[0,0,0,0,0,0,0,0,0,14],[0,0,0,0,0,0,0,0,0,14],[0,0,0,0,0,0,0,0,0,14],[0,0,0,0,0,0,0,0,0,14]]

如果我试图将一个值分配给倒数第二个值(map[9][8]),它也会填充所有其他值的倒数第二的值。

但是,当我将值分配给数组的原始部分时,它可以正常工作。我到底做错了什么?

我已经尽力解释了——请随意询问更多细节。

按行展开时,您将多次推送同一数组。因此,数组中的每一个新行都指向相同的位置(相同的列数组)。因此,当你改变一个时,它们"全部"似乎都改变了。

相反,您希望为每一个新行创建一个新数组,并推送它:

if (rowsDiff > 0) {
    i=0;
    while (i<rowsDiff) {
        arr.push(makeArrayOf(0, cols));
        i++
    }
}