x*y
デフォルト値で配列を作成する関数があります。この値を2つの長さの配列にします
しかし、それはx*y
もはや2次元配列ではなく、x*y*2
3次元配列です!そのためには、別の関数が必要です。
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);
});