1

Тема: Масиви: незрозуміла поведінка при заповненні в циклом

Доброго дня.

Недавно почав вивчати JS. Намагаюсь зрозуміти як він працює, пишучи прості програми. Зазвичай, коли щось не зрозуміло, вдається розібратись  з допомогою Google, але в даному випадку я навіть не знаю як сформувати свій запит. 

Хочу зрозуміти чому фрагмент коду відмовляється працювати в середині циклу, але працює поза його межами.

Є масив table, який потрібно заповнити значеннями з масиву randomNumbers.
За умовою програми масив table завжди має довжину 9, 15, 25 або 49, а randomNumbers - на 1 менше. Середній елемент масиву table потрібно пропустити.

Коли цикл доходить до середнього елементу table, значення з randomNumbers має присвоїтись не і-му елементу table, а останньому.

Ось в такому випадку останній елемент масиву table після виконання циклу міститиме значення undefined:

for (let i = 0; i < table.length; i++) {
      if(i === (table.length - 1)/2) {
            table[table.length - 1].innerHTML = randomNumbers[i];
            continue;
      }
        table[i].innerHTML = randomNumbers[i];
}

https://i.ibb.co/6RpfJ1R/Screenshot-from-2021-12-04-14-08-50.png



Але якщо останньому елементу масиву table призначити потрібне значення поза циклом, тоді воно вже міститиме саме це потрібне значення.

for (let i = 0; i < table.length; i++) {
    if(i === (table.length - 1)/2) {
        continue;
    }
    table[i].innerHTML = randomNumbers[i];
}

table[table.length - 1].innerHTML = randomNumbers[(table.length - 1) / 2];

https://i.ibb.co/1qr7F3T/Screenshot-from-2021-12-04-14-12-46.png



З повним кодом можна ознайомитись на моєму гітхабі в папці shulte_tables

Подякували: 0xDADA11C7, /KIT\, bebyk3

2 Востаннє редагувалося koala (04.12.2021 14:46:47)

Re: Масиви: незрозуміла поведінка при заповненні в циклом

Ну так усе правильно. У вас 9 елементів у table і 8 у randomNumbers.

table[i].innerHTML = randomNumbers[i];

для останнього елементу в table буде вже поза randomNumbers. Можете спробувати якось так:

let i = 0;
for(number of randomNumbers){
    table[i].innerHTML = number;
    i++;
    if(i==(table.length-1)/2)
        i++;    
}

або в два цикли, для першої і другої половини:

let half = (table.length-1)/2;
for(let i = 0; i<half ; i++)
    table[i].innerHTML = randomNumbers[i];
for(let i = half+1; i<table.length; i++)
    table[i].innerHTML = randomNumbers[i-half-1];
}
Подякували: 0xDADA11C7, FakiNyan, cstmstr, leofun01, /KIT\5

3

Re: Масиви: незрозуміла поведінка при заповненні в циклом

Дякую за відгук! Безперечно, ваша реалізація виглядає достойно.

Як я розумію, ваше бачення це -  умовно розділити randomNumbers на дві частини і з певного місця присвоювати значення зі зміщенням. Але боюсь, що ви не зовсім зрозуміли що я мав на увазі.

Постараюсь продемонструвати графічно алгоритм, який я намагався реалізувати:
https://i.ibb.co/Bcj5R6x/sample.png
Отже: середній елемент tables чіпати не потрібно, тому в цьому місці відповідне значення з randomNumbers присвоюємо в кінець tables.

Але якщо зробити це всередині циклу, то отримаю undefined.
А якщо те саме виконати вже поза циклом, тоді все нормально.

Я намагаюсь зрозуміти чому відбувається саме так і що я упускаю.

4

Re: Масиви: незрозуміла поведінка при заповненні в циклом

а мені здається, що пан koala все правильно сказав.

for (let i = 0; i < table.length; i++) {
      if(i === (table.length - 1)/2) {
            table[table.length - 1].innerHTML = randomNumbers[i];
            continue;
      }
        table[i].innerHTML = randomNumbers[i];
}

ви два рази заносите якесь значення в останню комірку table.
Перший раз тут

 if(i === (table.length - 1)/2) {
            table[table.length - 1].innerHTML = randomNumbers[i];
            continue;
      }

другий раз тут

        table[i].innerHTML = randomNumbers[i];

В цей момент i буде

 table.length - 1

, але довжина

randomNumbers

на 1 менша, тому ви заносите в

table[i].innerHTML 

undefined, адже в цей момент

randomNumbers[i]

просто не існує.

Подякували: cstmstr1

5

Re: Масиви: незрозуміла поведінка при заповненні в циклом

Вибачаюсь, не одразу зрозумів що ви хотіли мені донести. Я зрозумів як це зробити у відповідності до мого алгоритму!

Достатньо пропустити останню ітерацію. Для цього було достатньо в циклі трохи змінити умову, а саме дописати -1

тобто з цього

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

зробити це

for (let i = 0; i < table.length - 1; i++)

Дуже дякую за допомогу!

Подякували: 0xDADA11C7, koala, mamkin haker, /KIT\4

6

Re: Масиви: незрозуміла поведінка при заповненні в циклом

Дякую за чудово оформлене питання. Сподіваюся ще бачити вас на форумі.