如何在js中加载2d数组?

时间:2011-01-23 15:20:48

标签: javascript

好的,我正在尝试加载二维阵列并遇到一些问题。这是我的代码:

var blockSize = 30;

var level = new Array(new Array(0, 1, 0, 1, 0, 1, 0, 1, 0, 1), new Array(1, 0, 1, 0, 1, 0, 1, 0, 1, 0));

var blockArray = new Array(1);
blockArray[0] = new Array(1);

function readLevel() {
    for (var i = 0; i < level.length; i++) {
        for (var j = 0; j < level[i].length; j++) {
            var tempImg = new Image();
            tempImg.src = "images/block.png";
            blockArray[i][j] = new block(i * blockSize, j * blockSize, level[i][j], false, false, tempImg);

            //throw('blockArray['+i+']'+j+'] = ' + level[i][j]);
        }
    }
}

这是我的错误:

Firebug's log limit has been reached. 0 entries not shown.      Preferences  
blockArray[i] is undefined
[Break On This Error] blockArray[i][j] = new block(i *...level[i][j], false, false, tempImg); 

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:5)

i上的外部循环将来自0 .. 1(含)。你永远不会将blockArray[1]设置为任何东西,所以它是未定义的。因此,您的blockArray[i][j] = ...行会失败,因为您无法索引未定义的值(blockArray[i] = i时未定义1)。

我不完全确定你的代码应该做什么,但无论如何这应该让你接近:

var blockSize = 30;

var level = [
                [0, 1, 0, 1, 0, 1, 0, 1, 0, 1],
                [1, 0, 1, 0, 1, 0, 1, 0, 1, 0]
            ];

var blockArray = [];

function readLevel() {
    for (var i = 0; i < level.length; i++) {
        blockArray[i] = []; // Create the second level for this index
        for (var j = 0; j < level[i].length; j++) {
            var tempImg = new Image();
            tempImg.src = "images/block.png";
            blockArray[i][j] = new block(i * blockSize, j * blockSize, level[i][j], false, false, tempImg);

            //throw('blockArray['+i+']'+j+'] = ' + level[i][j]);
        }
    }
}

请注意,我也放弃了new Array(n)语法,转而使用数组文字语法。我认为你在这里做的事情更清楚。

重要的是要意识到JavaScript并不真正拥有数组,它当然没有2D数组。 JavaScript“数组”实际上只是对一类属性名称(完全由数字组成)并具有特殊length属性的特殊处理的对象。 (当然,他们拥有从Array.prototype继承的所有功能。)More here.

答案 1 :(得分:0)

尝试在两个for循环之间添加这些行

blockArray[i] = new Array();

创建第二级数组。

function readLevel() {
    for (var i = 0; i < level.length; i++) {
        blockArray[i] = new Array();
        for (var j = 0; j < level[i].length; j++) {
            [etc]
        }
    }
}