【问题标题】:how to load a 2d array in js?如何在js中加载二维数组?
【发布时间】:2011-01-23 15:20:48
【问题描述】:

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

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

我该如何解决这个问题?

【问题讨论】:

  • 当您编写new Array(1) 时,您是在尝试创建一个空的一元数组,还是一个包含1 的一元数组?除非您想创建一个空的 n-element 数组,否则没有理由使用 new Array() 构造函数;只需使用数组文字代替。例如,您的 new Array(0, 1, 0, 1, 0, 1, 0, 1, 0, 1) 呼叫将简单地变为 [0, 1, 0, 1, 0, 1, 0, 1, 0, 1]
  • 更好:var level = [[0, 1, 0, 1, 0, 1, 0, 1, 0, 1], [1, 0, 1, 0, 1, 0, 1, 0, 1, 0]];

标签: javascript


【解决方案1】:

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.

【讨论】:

  • @CyanPrime:不用担心,很高兴有帮助。我在答案末尾添加了一个可能感兴趣的链接。
【解决方案2】:

尝试在两个 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]
        }
    }
}

【讨论】:

  • blockArray[i] = []; 为什么你们一直使用这种其他符号? [] 显然更好。
  • 啊哈:) 好的。感谢您的链接!
  • 它更简洁易读,尤其是对于嵌套数组。此外,参数的数量和类型也存在这个问题:new Array(3)new Array(3, 3) 和新的 Array('3') 分别生成出乎意料的不同结果 [][3, 3]['3']。专业的 JavaScript 程序员避免使用 new Array() 符号。
猜你喜欢
  • 1970-01-01
  • 2020-12-04
  • 1970-01-01
  • 2020-04-10
  • 1970-01-01
  • 1970-01-01
  • 2012-02-09
  • 1970-01-01
  • 2019-03-07
相关资源
最近更新 更多