Метод рекурсии в JS

#javascript #recursion

#javascript #рекурсия

Вопрос:

первый question…be нежный.. Я пытаюсь добавить нули перед числом, введенным пользователем, поэтому я пытаюсь использовать рекурсивный метод в Vue. Однако возвращаемое значение всегда не определено. Пожалуйста, посмотрите мой код ниже.

 addZeros(num) {
  if (num.length < 7) {
    if (!isNaN(Number(num))) {
      num = '0'   num
      this.addZeros(num)
    } else {
      console.log('error')
      return 'error' //this gets returned no problem
    }
  } else {
    console.log('RETURN:', num) //this shows the correct number but does NOT get returned

    return num  **//why is this not being returned??**
  }

  // return num <-- this will return a value to the caller but basically returns the param coming in
},
  

Я вызываю этот метод из другого метода,

  async rowClicked(item) {
    var my_num = '0'
        my_num = this.addZeros(item)

    //my_num = undefined!!
 }
  

Комментарии:

1. попробуйте return this.addZeros(num)

2. вам нужно return this.addZeroes в вашем операторе isNaN if.

3. Это сделало это!!! большое вам спасибо @danronmoon …. хотя я не понимаю, почему…

4. Рекурсивным функциям требуется условие выхода для всех логических путей

5. Я бы потянулся за String(num).padStart(7, "0")

Ответ №1:

Вашей функции требуется возврат при вызове самой себя. Я сам часто об этом забываю

 addZeros(num) {
  if (num.length < 7) {
    if (!isNaN(Number(num))) {
      num = '0'   num
      return this.addZeros(num) // RETURN HERE
    } else {
      console.log('error')
      return 'error'
    }
  } else {
    return num
  }
}
  

Вы могли бы также посмотреть на использование padStart для выполнения того, что вам нужно?

Ответ №2:

Если вы хотите использовать рекурсивный метод, тогда отлично, но это, вероятно, не лучший способ реализовать эту функцию

 function addZeros(num) {
  const padding = '0000000';
  const numAsString = num.toString();

  if (numAsString.length === padding.length) {
    return numAsString;
  }

  if (numAsString.length > padding.length) {
    // You could throw an error in here otherwise it will show a number larger than 7 characters
    return numAsString;
  }

  return padding.substr(0, Math.abs(padding.length - numAsString.length))
}