これが基本的すぎる場合は申し訳ありませんが、JavaScript で 4 次元配列 (サイズ 6x6x6x6) を定義し、すべて 1 に初期化するのに苦労しています。これを行う最も簡単な方法は何ですか?
ありがとう!
これが基本的すぎる場合は申し訳ありませんが、JavaScript で 4 次元配列 (サイズ 6x6x6x6) を定義し、すべて 1 に初期化するのに苦労しています。これを行う最も簡単な方法は何ですか?
ありがとう!
リテラル構文を使用できますが、非常に大きくて扱いにくくなります。次のようなことを試してみてください。
var x = [1, 1, 1, 1, 1, 1];
for (var i = 1; i < 4; i++) {
x = [x, x, x, x, x, x];
}
少し簡単な解決策を見つけました:
var x = 1;
for (var i = 0; i < 4; i++) {
x = [x, x, x, x, x, x];
}
もっと簡単な方法があるはずですが、これでうまくいきます。
var array = [];
for(var i=0; i<6; i++) {
for(var j=0; j<6; j++) {
for(var k=0; k<6; k++) {
for(var l=0; l<6; l++) {
array[i][j][k][l]=1;
}
}
}
}
編集
n 次元の AxBxCxDx... 配列を生成するには (未テスト):
Array.prototype.fill = function(elem, n) {
for(var i=0; i<n; i++, this.push(elem));
}
function generateArray() {
var dimensions = Array.prototype.slice.call(arguments);
var x = 1;
for (var i = dimensions.length-1; i >= 0; i--) {
x = [].fill(x, dimensions[i]);
}
return x;
}
2x3x4x5 行列を生成するには:
generateArray(2,3,4,5);
ddlshack の一般化されたメソッドを実装しましたが、JavaScript では配列が「参照渡し」であるために問題が発生しました。これにより、配列の各次元は、同じ配列のコピーではなく、同じ配列への複数の参照を保持していました。この問題を修正するために、次のようにソリューションを実装しました (他の唯一の違いは、配列のプロトタイプを変更するのではなく、2 つ目の関数を使用したことです)。
var fillArray = function(val, dim) {
var a = [];
for (var i = 0; i < dim; i++) {
if (Object.prototype.toString.call(val) === "[object Array]") {
val = val.slice(0);
}
a.push(val);
}
return a;
};
var generateArray = function() {
var dimensions = Array.prototype.slice.call(arguments),
val = 0;
for (var i = (dimensions.length - 1); i >= 0; i--) {
val = fillArray(val, dimensions[i]);
}
return val;
};