2012-04-18 14 views
0

関数から値に初期化された多次元配列を取得しようとしています。私はそれを試しましたが、結果は私が期待していたものではありません。関数から多次元配列を取得

ELEMSIZE寸法を持つ配列であり、そしてINITは、各要素の値です。

function MakeArray(elemSize, init) { 
    var a = []; 

    for (var i = 0; i < elemSize.length; i++) { 
     var aj = []; 
     for (var j = 0; j < elemSize[i]; j++) { 
      aj[j] = init; 
     } 
     a[i] = aj; 
    } 

    return a; 
} 

これは結果

>>> var a = MakeArray([3,2], 5); 
undefined 
>>> a 
[[5, 5, 5], [5, 5]] 

ですが、私はなるだろう:

[[5 5] [5 5] [5 5]] 
+0

これを解決するためにさまざまな実装を行ってくれてありがとうございます。 –

答えて

0

elemSize.lengthelemSize[i]を反復が、elemSize[0]elemSize[1]ないでください:

function MakeArray(elemSize, init) { 
    var a = []; 

    for (var i = 0; i < elemSize[0]; i++) { 
     var aj = []; 
     for (var j = 0; j < elemSize[1]; j++) { 
      aj[j] = init; 
     } 
     a[i] = aj; 
    } 

    return a; 
} 

あなたは本当の多次元配列をしたい場合は、あなたがループのアプローチは、このために動作しないよう再帰関数を作成する必要があります。

function MakeArray(elemSize,init){ 
    if(elemSize.length === 0) 
     return init; 

    var result = []; 
    var otherSize = elemSize.slice(1); 
    var otherArray = MakeArray(otherSize,init); 
    for(var i = 0; i < elemSize[0]; ++i){ 
     result.push(otherArray); 
    } 
    return result; 
} 

var myArray = MakeArray([5,5,5],2); 
1

あなたのロジックと少し間違っています。ここでは、(2つの要素を含む3つのアレイ)欲しいものを出力するコードである:

function MakeArray(elemSize, init) { 
    var a = []; 

    for (var i = 0; i < elemSize[0]; i++) { 
     var aj = []; 
     for (var j = 0; j < elemSize[1]; j++) { 
      aj[j] = init; 
     } 
     a[i] = aj; 
    } 

    return a; 
} 

ELEMSIZEの最初の要素は、配列の数を表し、2つ目は、各配列の長さを表します。

0

任意の次元の配列を作成するには、再帰アルゴリズムが必要です。

function MakeArray(sizes, init) { 
    var a = []; 
    if (sizes.length > 1) { 
     var b = sizes.slice(1); 
     for (var i = 0; i < sizes[0]; i++) { 
      a.push(MakeArray(b, init)); 
     } 
    } else { 
     for (var i = 0; i < sizes[0]; i++) { 
      a.push(init); 
     } 
    } 
    return a; 
}