JS массивы 3 глубоко теряется - PullRequest
1 голос
/ 30 апреля 2019

Обучение JS по игре.и, конечно, простой список - это кликер :-) ОК, так что я очень помог с этим, но секция массива просто не тонет. Массивы JS не работают как массивы, к которым я привык.вопрос из двух частей: 1. Почему следующий код продолжает говорить weaponlevelIfo[0] undefined, когда он определен?Пожалуйста, объясните свой ответ, не просто исправьте мой 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],

Но, как вы можете видеть из кода, назначая их напрямую или во время выполнения, я получаю неопределенную ошибку

Чего не хватает, чтобы позволить мне назначить их во время выполнения?

Ответы [ 3 ]

1 голос
/ 30 апреля 2019

Два выпуска:

  • Вам необходимо вызвать 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 голосов
/ 30 апреля 2019

Вы определяете массив с двумя элементами Array(2) с индексами 0 и 1, но используете индекс 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));
0 голосов
/ 30 апреля 2019

Когда вы создаете массив в javascript с new Array(2), это массив с двумя позициями. В этом примере (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]);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...