1
var MultiArray = (function(){

    var MultiArray = function(param){

            var i = param.array.length;
            while(i--){
                param.array[i] = MultiArray({
                array: new Array(dims[0]),
                dims: dims.splice(1,dims.length-1)
                });
            }

        return param.array

    };

    return function(){

        var length = arguments.length - 1;
            array = new Array(arguments[0]),
            dims = [length];

        for(var i = 0; i < length; i++){
            dims[i] = arguments[i+1];
        }   

        MultiArray({
            array: array,
            dims: dims
        });

        return array;
    };

})();

多次元配列を作成する関数を作成しようとしているのでvar mdArray = MultiArray(3,3,3);、3x3x3要素の3D配列を作成します。しかし、このメソッドを試すと、最大呼び出しスタックサイズを超えてしまいます。このような多次元配列関数を作成するためのより良い方法はありますか?

4

2 に答える 2

0

innerMultiArrayには、常にparam.arraywith 1 アイテムがあり、無限の再帰が行われます。

于 2012-10-31T10:35:51.730 に答える
0
var MultiArray = (function() {

    var MultiArray = function(param) {

        var myDims, i = param.array.length;
        if(param.dims.length === 0){
            return;
        }
        while(i--) {
            myDims = param.dims.slice(0);
            myDims = myDims.splice(1, myDims.length - 1);
            param.array[i] = new Array(param.dims[0]);
            MultiArray({
                array : param.array[i],
                dims : myDims
            });
        }

    };

    return function() {

        var length = arguments.length - 1, array = new Array(arguments[0]), dims = [length];

        for(var i = 0; i < length; i++) {
            dims[i] = arguments[i + 1];
        }

        MultiArray({
            array : array,
            dims : dims
        });

        return array;
    };
})();

上記のコードは正しく、元のコードは単純に間違っていたため、無限再帰ループが発生しました。現在は意図したとおりに機能し、var mdArray = MultiArray(2,3,4,5);次元 2x3x4x5 の配列を作成します。dims引数の配列の長さが 0 の場合、再帰関数はすぐに戻ります。

于 2012-10-31T17:05:55.307 に答える