是否可以在一行代码中用JavaScript定义和初始化多维数组?

时间:2012-06-07 23:43:27

标签: javascript

很抱歉,如果这太基础了,但我正在努力在JavaScript中定义4维数组(大小为6x6x6x6)并将其初始化为所有1#。最简单的方法是什么?

谢谢!

3 个答案:

答案 0 :(得分:4)

您可以使用文字语法,但它会非常庞大​​和繁琐。你可能想尝试这样的事情:

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];
}

答案 1 :(得分:1)

似乎应该有更简单的方法,但这样做会。

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);

答案 2 :(得分:0)

我实现了ddlshack的通用方法,但由于数组在JavaScript中“通过引用传递”而遇到了问题。这导致数组的每个维度保持对同一数组的多个引用,而不是它的副本。为了解决这个问题,我按如下方式实现了解决方案(唯一的另一个区别是我使用了第二个函数而不是修改了Array的原型)。

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;
};