Почему после того, что я действительно хочу, появляется строка "undefined"? - PullRequest
1 голос
/ 06 мая 2020

Спойлер: я публикую решение проблемы "Лестница" HackerRank. Итак, я пытаюсь решить задачу для начинающих, используя JS, чтобы напечатать лестницу. Мне нужно написать функцию, которая печатает лестницу в соответствии с количеством шагов, введенных в качестве параметра. Например:

stairs(4)

Должно возвращать

   #
  ##
 ###
####

Я получил этот код, и хотя он в основном в порядке, в конце я получаю строку «undefined». Итак:

function staircase(n) {

    var stair=[]; /*array of strings */

    for (var i=1; i <=n; i++){
        var step= " ".repeat(n-i).concat("#".repeat(i));
        stair.push(step);

    }
    for (var i=0; i<=stair.length; i++){
        console.log(stair[i])
    }
}

При запуске staircase (6) он возвращает следующее:

     #
    ##
   ###
  ####
 #####
######
undefined

Меня беспокоит слово «undefined», которое не позволяет мне отправить сообщение. Я только догадывался, что возможное решение - заменить «<=» во втором объявлении l oop на просто «<», и это сделало это: </p>

function staircase(n) {

    var stair=[]; /*array of strings */

    for (var i=1; i <=n; i++){
        var step= " ".repeat(n-i).concat("#".repeat(i));
        stair.push(step);

    }
    for (var i=0; i<stair.length; i++){
        console.log(stair[i])
    }
}

Когда я бегу по лестнице (6) , он возвращает то, что должен:

     #
    ##
   ###
  ####
 #####
######

Хотя проблема решена, я не понимаю, почему именно. У меня вопрос: почему слово «неопределенное» появляется в первом случае и почему сделанная мной замена исправляет его? Спасибо!

Ответы [ 4 ]

1 голос
/ 06 мая 2020

Учитывая массив [1, 2, 3], он будет иметь length из 3.

  • foo[0] равно 1
  • foo[1] равно 2
  • foo[2] равно 3

Начиная с 3 <= array.length, вы затем регистрируете foo[3], что является… undefined.

0 голосов
/ 06 мая 2020

Когда вы запускаете staircase (6) с i <= n в for l oop, на последней итерации вы обращаетесь к элементу с шестым индексом, который не существует, следовательно, он не определен. Индексы массива начинаются с 0, поэтому для лестницы (6) индексы go только до 5. </p>

0 голосов
/ 06 мая 2020

Ваш первый l oop работает от 1 до n (n итераций)

for (var i=1; i <=n; i++){
        // statements
}

, а ваш второй l oop работает от 0 до n (всего n + 1 итераций)

for (var i=0; i<=stair.length; i++){
        console.log(stair[i])
}

Поскольку лестница содержит только n значений, на n + 1-й итерации возвращается undefined.

0 голосов
/ 06 мая 2020

Вы должны работать с массивом stair до i < stair.length следующим образом:

function staircase(n) {

  var stair=[]; /*array of strings */

  for (var i=1; i <=n; i++){
      var step= " ".repeat(n-i).concat("#".repeat(i));
      stair.push(step);

  }
  for (var i=0; i<stair.length; i++){
      console.log(stair[i])
  }
}

staircase(6)

Согласно MDN:

JavaScript массивы имеют нулевой индекс: первый элемент массива имеет индекс 0, а последний элемент имеет индекс, равный значению свойства длины массива минус 1.

Доступ к элементам массива

...