奇怪的javascript数组行为。可以修复吗?

时间:2012-07-14 21:15:00

标签: javascript arrays push pop

我有一个像这样的多维数组:

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语句,我会弹出一些值或推送一些新值(零),具体取决于rowsDiff / colsDiff变量是正数还是负数。

我的问题是当我从最大的地图[4] [4]调整数组到地图[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])指定一个值,它也会填充所有其他值的倒数第二个值。

但是当我为数组的原始部分赋值时,它可以正常工作。 我在这里做错了什么?

我试图尽我所能解释它 - 随时可以询问更多细节。

1 个答案:

答案 0 :(得分:4)

按行扩展时,您会多次按相同的数组。因此,数组的每个新行只是指向相同的位置(相同的列数组)。因此,当你改变一个时,他们“全部”似乎都会改变。

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

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