Вам нужно добавить предложение return
к рекурсивному вызову, иначе результат рекурсивного вызова будет потерян:
function createCheckDigit(membershipId)
{
let checkDigit = 0;
for (let i = 0; i < membershipId.length; i++)
{
checkDigit += parseInt(membershipId.substring(i, i + 1));
}
if (checkDigit.toString().length > 1)
{
return createCheckDigit(checkDigit.toString());
}
else
{
return checkDigit;
}
}
console.log(createCheckDigit("55555"));
.as-console {background-color:black !important; color:lime;}
.as-console-wrapper {max-height:100% !important; top:0;}
Однако мне удобнее всегда ставить базовое условие рекурсивного вызова в начале.Также, используя String.split () и Array.reduce () , вы можете сделать что-то вроде следующего:
function createCheckDigit(membershipId)
{
if (!parseInt(membershipId) || membershipId.length <= 1)
return isNaN(+membershipId) ? 0 : +membershipId;
return createCheckDigit(
membershipId.split("").reduce((acc, n) => ((+acc) + (+n)).toString())
);
}
console.log("Result for '55555':", createCheckDigit("55555"));
console.log("Result for null:", createCheckDigit(null));
console.log("Result for undefined:", createCheckDigit(undefined));
console.log("Result for '1':", createCheckDigit("1"));
console.log("Result for 'foo':", createCheckDigit("foo"));
.as-console {background-color:black !important; color:lime;}
.as-console-wrapper {max-height:100% !important; top:0;}
Обратите внимание на использование Unary Plus Operator для приведения цифр от строки к числам, от MDN :
унарный плюс - самый быстрый и предпочтительный способ преобразования чего-либо в число