JS数组3深陷迷路

问题描述 投票:1回答: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],

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

允许我在运行时分配这些内容的缺失是什么?

javascript arrays multidimensional-array
3个回答
1
投票

两个问题:

  • 你需要调用initGame来创建所有这些子数组,否则weaponLevelNfo[0]没有被定义,因此weaponLevelNfo[0][0]将触发你得到的错误。
  • 你的外循环执行一次迭代太多(<=)。更改: for (let i=0; i <= weaponLevelNfo.length; i++) { 通过 for (let i=0; i < weaponLevelNfo.length; i++) { 如果没有这种改变,最后一次迭代实际上是在插槽i中向数组添加一个元素,因此数组的长度增加......循环变为无限。

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

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

0
投票

当您使用new Array(2)在javascript中创建数组时,这是一个包含两个位置的数组。在此示例(new Array(2))中,您可以在索引0和索引1处访问它。请考虑以下内容:

var newArr = new Array(2);

然后,您可以通过以下方式访问这两个位置:

var position1 = newArr[0];
var position2 = newArr[1];

所以当你尝试这个:

var position = newArr[2];

这将抛出一个未定义的异常。

您可以将示例代码的结尾更改为:

weaponLevelNfo[0][0][1]=3;
console.log(weaponLevelNfo[0][0][1]);

0
投票

使用索引为0和1的两个元素Array(2)定义数组,但使用索引2。

要初始化由零填充的多维数组(如果不是删除.fill(0)),请使用

[...Array(14)].map(x=>[...Array(9)].map(y=>Array(2).fill(0)));

let a=[...Array(14)].map(x=>[...Array(9)].map(y=>Array(2).fill(0)));

a[13][8][1]=3;

console.log('Last element value:',a[13][8][1]);
console.log(JSON.stringify(a));
© www.soinside.com 2019 - 2024. All rights reserved.