函数返回int返回未定义

时间:2019-04-11 15:31:40

标签: javascript function

我正在做一个简单的函数,该函数将一串数字中的每个数字相加,直到成为单个单位,例如“ 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

3 个答案:

答案 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仅在函数范围内声明了变量checkDigiti,而没有泄漏到全局范围中。

答案 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