2

次のような多次元配列があります。

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 変数が正か負かに応じて、いくつかの値をポップアウトするか、いくつかの新しい値 (ゼロ) をプッシュします。

私の問題は、配列のサイズを 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]]

最後から 2 番目の値 (map[9][8]) に値を割り当てようとすると、他のすべての値の最後から 2 番目の値も埋められます。

しかし、配列の元の部分に値を割り当てると、正しく機能します。ここで何が間違っているのですか?

できる限り説明するように努めました。詳細についてはお気軽にお問い合わせください。

4

1 に答える 1

4

行ごとに展開するときに、同じ配列を複数回プッシュしています。したがって、配列の新しい各行は、同じ場所 (同じ列配列) を指しています。したがって、1 つを変更すると、それらの「すべて」が変更されたように見えます。

代わりに、新しい行ごとに新しい配列を作成し、それをプッシュします。

if (rowsDiff > 0) {
    i=0;
    while (i<rowsDiff) {
        arr.push(makeArrayOf(0, cols));
        i++
    }
}
于 2012-07-14T21:20:35.480 に答える