#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))
}