Функция return на int возвращает undefined - PullRequest
1 голос
/ 11 апреля 2019

Я делаю простую функцию, которая суммирует каждое отдельное число в строке чисел, пока оно не станет единым целым, например, «55555» -> 5 + 5 + 5 + 5 + 5 = 25 -> 2 + 5 = 7но моя функция всегда возвращает неопределенное значение, код работает, и я могу console.log получить правильный ответ, но фактическая функция всегда возвращает неопределенное значение

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;
  }

}

, если I console.log(checkDigit) в операторе else для вызова функции createCheckDigit("55555") отображается 7, что правильно, но сама функция всегда возвращает неопределенное значение

Ответы [ 3 ]

1 голос
/ 11 апреля 2019

Вам нужно добавить предложение 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 :

унарный плюс - самый быстрый и предпочтительный способ преобразования чего-либо в число

1 голос
/ 11 апреля 2019

При создании рекурсивных функций вам необходимо return результат вызова рекурсивной функции.

return createCheckDigit(checkDigit.toString());

Кроме того, просто примечание, при использовании parseInt предлагается передать 10 как2-й параметр, чтобы убедиться, что он возвращает то, что вы ожидаете.

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 только внутри области функции и не просочиться в глобальную область.

0 голосов
/ 11 апреля 2019

Вы можете использовать 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...