JavaScript的; n维数组创建

Chr*_*ris 9 javascript arrays

在为简单语言构建JavaScript解释器的过程中,我遇到了以下问题;

解析之后,我们得到一个索引数组,指定要修改的n维数组中的元素.例如,在解析之后:

a[1, 1, 1]
Run Code Online (Sandbox Code Playgroud)

我们得到一个数组[1, 1, 1].我正在处理的语言没有变量定义,因此变量在首次使用时会被初始化.我的目标是能够创建这个n维数组,以便我可以将它放在变量表中(在上面的例子中,我们需要创建一个三维数组).

简短的问题:

有没有办法在JavaScript中创建一个n维数组而不使用eval()

Bar*_*mar 11

在Chrome中测试过:

function createNDimArray(dimensions) {
    if (dimensions.length > 0) {
        var dim = dimensions[0];
        var rest = dimensions.slice(1);
        var newArray = new Array();
        for (var i = 0; i < dim; i++) {
            newArray[i] = createNDimArray(rest);
        }
        return newArray;
     } else {
        return undefined;
     }
 }
Run Code Online (Sandbox Code Playgroud)

然后createNDimArray([3, 2, 5])返回一个3x2x5数组.

您可以使用类似的递归过程来访问索引在数组中的元素:

function getElement(array, indices) {
    if (indices.length == 0) {
        return array;
    } else {
        return getElement(array[indices[0]], indices.slice(1));
    }
 }
Run Code Online (Sandbox Code Playgroud)

设置元素是类似的,并留给读者练习. 


Pet*_*ete 5

没有内置任何东西,但创建一个可以完成工作的功能非常容易:

var genArray = function () {
    var arr, len, i;
    if(arguments.length > 0) {
        len = [].slice.call(arguments, 0, 1)[0];
        arr = new Array(len);
        for(i = 0; i < len; i++) {
            arr[i] = genArray.apply(null, [].slice.call(arguments, 1));
        }
    } else {
        return null; //or whatever you want to initialize values to.
    }
    return arr;
};

var a = genArray(3, 2); //is [[null, null],[null, null],[null, null]]
var b = genArray(3, 1, 1); //is [[[null]],[[null]],[[null]]]

a[0][1]; //is null
b[1][0][0]; //is null
b[1][0][0] = 3;
b[1][0][0]; //is 3;
b; //is [[[null]],[[3]],[[null]]]
Run Code Online (Sandbox Code Playgroud)

也许这会有所帮助?

PS -

我知道这似乎比必要的努力更多.但不幸的是,JavaScript数组并不是真正的"数组"(如果用"数组"表示连续的,索引的,不可变的内存块).在大多数语言中,它们更像是"地图".因此创建它们需要花费一定的精力.大多数语言都没有创建多维数组的问题,因为它们只是做了一些简单的乘法,然后是一个malloc().但是使用JavaScript,如果你想预先构建它们,你必须以递归方式生成数组.这很痛苦,但它确实展示了口译员所需的努力.

去搞清楚.