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]]
4

3 に答える 3

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 番目の要素は各配列の長さを表します。

于 2012-04-18T12:13:37.410 に答える
0

elemSize.lengthand を反復しないでくださいelemSize[i]but elemSize[0]and 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);
于 2012-04-18T12:13:31.213 に答える
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;
}
于 2012-04-18T12:19:09.110 に答える