14

空の多次元 JavaScript 配列の次元を設定する合理的に簡潔な方法を見つけようとしましたが、これまでのところ成功していません。

まず、 を使用して空の 10x10x10 配列を初期化しようとしましvar theArray = new Array(10, 10 10)たが、代わりに 3 つの要素を持つ 1 次元配列しか作成されませんでした。

ネストされた for ループを使用して空の 10x10x10 配列を初期化する方法を理解しましたが、この方法で配列初期化子を記述するのは非常に面倒です。ネストされた for ループを使用して多次元配列を初期化するのは非常に面倒な場合があります: JavaScript で空の多次元配列の次元を (任意の次元で) 設定するより簡潔な方法はありますか?

//Initializing an empty 10x10x10 array:
var theArray = new Array();
for(var a = 0; a < 10; a++){
    theArray[a] = new Array();
    for(var b = 0; b < 10; b++){
        theArray[a][b] = new Array();
        for(var c = 0; c < 10; c++){
            theArray[a][b][c] = 10
        }
    }
}

console.log(JSON.stringify(theArray));
4

6 に答える 6

6

この回答から適応:

function createArray(length) {
  var arr = new Array(length || 0),
      i = length;
    
  if (arguments.length > 1) {
    var args = Array.prototype.slice.call(arguments, 1);
    while(i--) arr[i] = createArray.apply(this, args);
  }        
  return arr;
 }

各次元の長さの引数を指定して呼び出すだけです。使用例:

  • var multiArray = createArray(10,10,10);等しい長さの 3 次元配列を返します。
  • var weirdArray = createArray(34,6,42,2);長さが等しくない 4 次元配列を返します。
于 2013-07-21T19:57:35.180 に答える
3
function multiDimArrayInit(dimensions, leafValue) {
    if (!dimensions.length) {
        return leafValue;
    }
    var arr = [];
    var subDimensions = dimensions.slice(1);
    for (var i = 0; i < dimensions[0]; i++) {
        arr.push(multiDimArrayInit(subDimensions, leafValue));
    }
    return arr;
}


console.log(multiDimArrayInit([2,8], "hi")); // counting the nested "hi"'s yields 16 of them

デモhttp://jsfiddle.net/WPrs3/

于 2013-07-21T20:00:42.497 に答える
0

非常に単純な関数で、任意の次元の配列を生成します。各次元の長さと、私にとっては通常「」である内容を指定してください

function arrayGen(content,dims,dim1Len,dim2Len,dim3Len...) {
  var args = arguments;
  function loop(dim) {
    var array = [];
    for (var a = 0; a < args[dim + 1]; a++) {
      if (dims > dim) {
        array[a] = loop(dim + 1);
      } else if (dims == dim) {
        array[a] = content;
      }
    }
    return array;
  }
  var  thisArray = loop(1);
  return thisArray;
};

私はこの機能を頻繁に使用します。時間を大幅に節約できます

于 2015-02-06T00:26:08.573 に答える
0

@chris コードのより簡潔なバージョン:

function multiDim (dims, leaf) {
  dims = Array.isArray (dims) ? dims.slice () : [dims];
  return Array.apply (null, Array (dims.shift ())).map (function (v, i) {
    return dims.length 
      ? multiDim (dims, typeof leaf == 'string' ? leaf.replace ('%i', i + ' %i') : leaf)
      : typeof leaf == 'string' ? leaf.replace ('%i', i) : leaf;
  });      
}

console.log (JSON.stringify (multiDim ([2,2], "hi %i"), null, '  ')); 

プロデュース:

[
  [
    "hi 0 0",
    "hi 0 1"
  ],
  [
    "hi 1 0",
    "hi 1 1"
  ]
]

このバージョンでは、最初の引数を 1 次元配列の数値として渡すことができます。リーフ値に含める%iと、リーフ値にインデックス値が提供されます。

で遊んでください:http://jsfiddle.net/jstoolsmith/r3eMR/

于 2013-07-24T09:18:01.083 に答える