首页 > 解决方案 > JS数组3深迷路

问题描述

通过游戏学习 JS。当然,最简单的人是点击器 :-) 好的,所以我在这方面得到了很多帮助,但是数组部分并没有陷入困境。JS 数组不像我习惯的数组那样工作。两部分问题:1.为什么下面的代码在weaponlevelIfo[0]定义时一直说未定义?请解释你的答案,不要只是纠正我的 LOL 2。我对在运行时填充代码更感兴趣

如前所述,我遇到的所有研究以及视频,都在谈论静态数据,即它是在编程级别而不是运行时进行的。

我有一个非常有耐心的社区人员,他试图帮助我理解 JS 数组,但我一定是盲目的,因为我没有看到它。我可以用其他语言做就好了。但是JS?不。


// produces weaponLevelNfo[weaponId][level][cost] and [goldperclick]
// weapon, level 1-9, cost/goldperclick on each level
var weaponLevelNfo = new Array(14); // Outter array comprised of weapons 0-14
function initGame() {

    for (let i=0; i <= weaponLevelNfo.length; i++) {

        weaponLevelNfo[i] = new Array(9); // create leves array under weaponid array
        for (let j = 0; j < weaponLevelNfo[i].length; j++) {    
            // loop through each 9 levels changing as needed
            weaponLevelNfo[i][j] = new Array(2); // create an object for readability


        }
    }

}
initGame();// added - forgot to add this in the original post (sorry)
    weaponLevelNfo[0][0][2]=3;
    console.log(weaponLevelNfo[0][0][2]);
// always gives me weaponLevelNfo[0] not defined

我更喜欢结果是这样的

weaponLevelNfo[x][y].cost,
weaponLevelNfo[x][y].incomePerClick,

但我很满意

weaponLevelNfo[x][y][z],
weaponLevelNfo[x][y][z],

但是正如您从代码中看到的那样,直接或在运行时分配它们,我得到未定义的错误

允许我在运行时分配这些缺少什么?

标签: javascriptarraysmultidimensional-array

解决方案


两个问题:

  • 您需要调用initGame来创建所有这些子数组,否则weaponLevelNfo[0]未定义,因此weaponLevelNfo[0][0]会触发您得到的错误。

  • 您的外部循环执行一次迭代太多(<=)。改变:

    for (let i=0; i <= weaponLevelNfo.length; i++) {
    

    经过

    for (let i=0; i < weaponLevelNfo.length; i++) {
    

    如果没有这种变化,最后一次迭代实际上是在 slot 中向数组添加i一个元素,因此数组的长度会增加......循环变为无限。

请注意,有更短的方法来定义这样的嵌套数组。例如:

var weaponLevelNfo = Array.from({length:14}, () => Array.from({length:9}, () => [0, 0]));

推荐阅读