在为简单语言构建JavaScript解释器的过程中,我遇到了以下问题;
解析之后,我们得到一个索引数组,指定要修改的n维数组中的元素.例如,在解析之后:
a[1, 1, 1]
Run Code Online (Sandbox Code Playgroud)
我们得到一个数组[1, 1, 1]
.我正在处理的语言没有变量定义,因此变量在首次使用时会被初始化.我的目标是能够创建这个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)
设置元素是类似的,并留给读者练习.
没有内置任何东西,但创建一个可以完成工作的功能非常容易:
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,如果你想预先构建它们,你必须以递归方式生成数组.这很痛苦,但它确实展示了口译员所需的努力.
去搞清楚.