0

jiddle-x*y arrayデフォルトで作成する関数がありますvalue。この値を2つの長さの配列にします。しかし、常に同じオブジェクトを渡すので、後で配列内のセルのいずれかを変更すると、それらすべてに影響するnew Array(2)ように見えます。parameterこの配列をdefaultセルごとにすべての値が同じになるようにする方法independent

fidleでは、すべてのセルが同じオブジェクトとしてデフォルト値を持っているため、一部のフィールドの値を変更し、最初のフィールドに依存する他のフィールドに警告します。

4

1 に答える 1

1

x*yデフォルト値で配列を作成する関数があります。この値を2つの長さの配列にします

しかし、それはx*yもはや2次元配列ではなく、x*y*23次元配列です!そのためには、別の関数が必要です。

new Array(2)パラメータとして渡すことにより、常に同じオブジェクトを渡すように見えるため、後で配列内のセルのいずれかを変更すると、それらすべてに影響します。

はい。1つのnew Array(2)オブジェクトを作成し、コードはすべてのフィールドがそれを指す2次元配列を作成します。

それらを独立させる方法は?

次のような別の関数を使用する必要があります

function newB(x, y, z) {
    var result = new Array(x);
    for (var i=0; i<x; i++) {
        result[i] = new Array(y);
        for (var j=0; j<y; j++) {
            result[i][j] = new Array(z);
        }
    }
    return result;
}

var fields = newA(5, 5, 2);

または、より一般的にするために、いくつかのファクトリ関数をパラメータとして使用できます。これにより、独立した値が作成されます。

function newB(x, y, valuemaker) {
    if (typeof valuemaker != "function") {
        var value = valuemaker || 0;
        valuemaker = function(){ return value; };
    }
    var result = new Array(x);
    for (var i=0; i<x; i++) {
        result[i] = new Array(y);
        for (var j=0; j<y; j++) {
            result[i][j] = valuemaker();
        }
    }
    return result;
}

var fields = newA(5, 5, function() {
    return new Array(2);
});
于 2013-03-26T01:45:29.173 に答える