首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JS数组3深度迷失

JS数组3深度迷失
EN

Stack Overflow用户
提问于 2019-04-30 20:07:01
回答 3查看 91关注 0票数 1

通过游戏学习JS。当然,简单的是:-)好的,我在这方面得到了很多帮助,但是数组部分并没有陷进去。JS数组不像我习惯的数组那样工作。两个部分的问题: 1.为什么下面的代码在定义weaponlevelIfo[0]时总是说它未定义?请解释你的答案,不要只是更正我的LOL 2。我更喜欢在运行时填充代码。

如前所述,我所遇到的所有研究,以及视频,都是关于静态数据的,也就是说,它是放在编程级别,而不是运行时。

我有一个非常有耐心的社区人士试图帮助我理解JS数组,但我肯定是盲目的,因为我没有看到它。我能用其他语言做得很好。但是JS呢?不是的。

代码语言:javascript
复制
// 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

我希望结果是这样的。

代码语言:javascript
复制
weaponLevelNfo[x][y].cost,
weaponLevelNfo[x][y].incomePerClick,

但我很高兴

代码语言:javascript
复制
weaponLevelNfo[x][y][z],
weaponLevelNfo[x][y][z],

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

没有什么允许我在运行时分配这些?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-04-30 20:20:56

两个问题:

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

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

代码语言:javascript
复制
var weaponLevelNfo = Array.from({length:14}, () => Array.from({length:9}, () => [0, 0]));
票数 1
EN

Stack Overflow用户

发布于 2019-04-30 20:14:15

当您用new Array(2)在javascript中创建一个数组时,这是一个具有两个位置的数组。在本例(new Array(2))中,您可以在索引0和索引1中访问它。

代码语言:javascript
复制
var newArr = new Array(2);

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

代码语言:javascript
复制
var position1 = newArr[0];
var position2 = newArr[1];

所以当你尝试这个:

代码语言:javascript
复制
var position = newArr[2];

这将引发一个未定义的异常。

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

代码语言:javascript
复制
weaponLevelNfo[0][0][1]=3;
console.log(weaponLevelNfo[0][0][1]);
票数 0
EN

Stack Overflow用户

发布于 2019-04-30 20:19:12

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

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

代码语言:javascript
复制
[...Array(14)].map(x=>[...Array(9)].map(y=>Array(2).fill(0)));

代码语言:javascript
复制
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));

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55928015

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档