我正在做一个简单的函数,该函数将一串数字中的每个数字相加,直到成为单个单位,例如“ 55555”-> 5 + 5 + 5 + 5 + 5 = 25-> 2 + 5 = 7但我的函数始终返回未定义,代码有效,并且我可以console.log正确答案,但实际函数始终返回undefined < / p>
function createCheckDigit(membershipId) {
checkDigit = 0
for (i = 0; i < membershipId.length; i++) {
checkDigit += parseInt(membershipId.substring(i, i + 1));
}
if (checkDigit.toString().length > 1) {
createCheckDigit(checkDigit.toString())
} else {
return checkDigit;
}
}
如果我在函数调用console.log(checkDigit)
的else语句中createCheckDigit("55555")
显示7是正确的,但是函数本身总是返回undefined
答案 0 :(得分:1)
创建递归函数时,您需要return
递归函数调用的结果。
return createCheckDigit(checkDigit.toString());
也请注意,在使用parseInt
时,建议将10
作为第二个参数传递,以确保它返回您期望的结果。
function createCheckDigit(membershipId) {
let checkDigit = 0
for (let i = 0; i < membershipId.length; i++) {
checkDigit += parseInt(membershipId.substring(i, i + 1), 10);
}
if (checkDigit.toString().length > 1) {
return createCheckDigit(checkDigit.toString())
} else {
return checkDigit;
}
}
console.log(createCheckDigit('55555'));
我还使用let
仅在函数范围内声明了变量checkDigit
和i
,而没有泄漏到全局范围中。
答案 1 :(得分:1)
您需要在递归调用上添加一个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()可以执行类似next的操作:
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 的数字:
一元加是将某物转换为数字的最快且首选的方式
答案 2 :(得分:0)
您可以使用Array.prototype.reduce()并执行如下递归功能:
const sumDigit = x => `${x}`.length > 1
? sumDigit([...`${x}`].reduce((sum, x) => sum + (+x), 0))
: +x;
console.log(sumDigit('55555')); // 7
console.log(sumDigit('5555')); // 2