Javascript 无法设置属性';3';二维数组中未定义的

Javascript 无法设置属性';3';二维数组中未定义的,javascript,Javascript,我正试图创建一个二维数组,但遇到了这个错误 我循环一个对象并尝试指定它们,但它不允许我为第二个维度指定值 这就是我所拥有的: //this is globally set var gcollision = new Array(); function create() { for (var X in sdata) { X = parseInt(X); for (var Y in sdata[X]) { Y = parseInt(Y)

我正试图创建一个二维数组,但遇到了这个错误

我循环一个对象并尝试指定它们,但它不允许我为第二个维度指定值

这就是我所拥有的:

//this is globally set
var gcollision = new Array();

function create() {
    for (var X in sdata) {
        X = parseInt(X);
        for (var Y in sdata[X]) {
            Y = parseInt(Y);
            width = parseInt(sdata[X][Y][2]);
            height = parseInt(sdata[X][Y][3]);
            for (i = X; i != X + width; i++) {
                //error occurs here "Uncaught TypeError: Cannot set property '3' of undefined"
                gcollision[i][Y] = 1
                for (j = Y; j != Y + height; j++) {
                    gcollision[X][j] = 1
                }
            }
        }
    }
如何使其正确设置的值

编辑sdata如下所示:

var sdata = {"4":{"7":["1","7","3","3"]},"3":{"3":["2","8","1","1"]}};
基本上,即使您创建了数组,这些索引仍然不存在,因此在将它们定义为数组之前,您不能将它们作为数组引用

如果将for循环设置得更为优化,则不必执行isset,只需创建
gcol[index]=Array()第一次访问的内部循环之前的右侧

基本上,即使您创建了数组,这些索引仍然不存在,因此在将它们定义为数组之前,您不能将它们作为数组引用


如果将for循环设置得更为优化,则不必执行isset,只需创建
gcol[index]=Array()第一次访问内部循环的右前方。

首先需要初始化第一级数组

function create() {
    for (var X in sdata) {
        X = parseInt(X);
        gcollision[X] = [];

        for (var Y in sdata[X]) {
            Y = parseInt(Y);
            width = parseInt(sdata[X][Y][2]);
            height = parseInt(sdata[X][Y][3]);
            for (i = X; i < X + width; i++) {
                gcollision[i][Y] = 1;

                for (j = Y; j < Y + height; j++) {
                    gcollision[X][j] = 1;
                }
            }
        }
    }
函数创建(){
用于(sdata中的变量X){
X=parseInt(X);
gcollision[X]=[];
用于(变量Y在sdata[X]中){
Y=parseInt(Y);
宽度=parseInt(sdata[X][Y][2]);
高度=parseInt(sdata[X][Y][3]);
对于(i=X;i
首先需要初始化第一级数组

function create() {
    for (var X in sdata) {
        X = parseInt(X);
        gcollision[X] = [];

        for (var Y in sdata[X]) {
            Y = parseInt(Y);
            width = parseInt(sdata[X][Y][2]);
            height = parseInt(sdata[X][Y][3]);
            for (i = X; i < X + width; i++) {
                gcollision[i][Y] = 1;

                for (j = Y; j < Y + height; j++) {
                    gcollision[X][j] = 1;
                }
            }
        }
    }
函数创建(){
用于(sdata中的变量X){
X=parseInt(X);
gcollision[X]=[];
用于(变量Y在sdata[X]中){
Y=parseInt(Y);
宽度=parseInt(sdata[X][Y][2]);
高度=parseInt(sdata[X][Y][3]);
对于(i=X;i
您的sdata是什么样子的?您的sdata是什么样子的?最后一个问题是,为此创建一个数组要比创建对象更好?哪一个在以后进行检查时更有效?我也不明白您对循环的设置更优化的意思是什么?在Javascript中,您不会注意到两者之间有多大的差异(数组和对象)。在内部,它们的处理方式可能是相同的。至于优化,我们目前正在检查内部循环中gcollision[]的类型,因为我不知道在宽度和高度变量中有什么类型的数据;如果可以重新构造函数,使gcol[index]数组是在该循环之外创建的,您可以为自己保存一个if操作顺序。有一个小问题,请参见屏幕截图:,我还在底部的问题中添加了sdata格式。它是否如您所预期的那样最终列出,我不确定我是否可以看到X:Y链接在一起进行检查?最后一个问题是为该操作创建数组有对象比有对象好吗?以后做检查哪一个更有效?我也不明白你说的循环设置更优化是什么意思?在Javascript中,你不会注意到这两个(数组和对象)之间有多大的区别。在内部,它们的处理方式可能是相同的。至于优化,我们目前正在检查内部循环中gcollision[]的类型,因为我不知道宽度和高度变量中的数据类型;如果您可以重新构造函数,使gcol[index]数组是在该循环之外创建的,您可以为自己节省一个if操作的顺序。有一个小问题,请参见屏幕截图:,我还在底部的问题中添加了sdata格式。它是否如您所预期的那样最终列出,我不确定我是否可以看到X:Y链接在一起进行检查?这是最有效的方法吗?@Dave:可能吧。不过,这并不重要。这是最有效的方法吗?@Dave:可能吧。不过,这并不重要。