如何将变量传递到JS while循环中?

时间:2019-03-22 20:56:58

标签: javascript while-loop

我想递归求和一个整数:将一个整数拆分为一个数组,然后对各个项求和,直到剩下单个整数数组为止。

这是我的逻辑

  1. 取一个整数(n)并将其拆分为一个数组。
  2. 对所有单个数字求和。
  3. 该数字是否大于9?
    1. 是:重复步骤1和2
    2. 否:返回电话号码
function digital_root(n) {
  let digits = (""+n).split("").map(Number);
  while (digits.length > 1) {
    let result = digits.reduce((sum, int) => sum + int);
    let digits = (""+result).split("").map(Number);
  }
  return digits;
};

这是我的Node.js遇到的错误代码(在上面的示例代码的第4行):

ReferenceError: digits is not defined
    at digital_root (repl:6:18)

我假设可以在while循环的范围内访问变量digits,但是显然,我似乎错了吗?有人可以在这里为我提供一些见识吗?


编辑:谢谢大家的帮助!我已经解决了这个问题。 为了您的好奇心,这是我的算法所基于的数学形式: http://mathworld.wolfram.com/DigitalRoot.html

也可以在一行中解决它:

function digital_root(n) {
  return (n - 1) % 9 + 1;
}

3 个答案:

答案 0 :(得分:2)

请勿以这种方式设置digits,循环内的digits前面不应有let,因为您已经在循环外定义了digits循环。

这将为您带来预期的结果:

digital_root = n => (Array.from(`${n}`)).reduce((sum, val) => sum + ~~val, 0);


console.log(digital_root(12345));

希望这会有所帮助,

答案 1 :(得分:2)

内部的数字字母(第5行)应该删除

function digital_root(n) {
  let digits = (""+n).split("").map(Number);
  while (digits.length > 1) {
    let result = digits.reduce((sum, int) => sum + int);
    digits = (""+result).split("").map(Number);
  }
  return digits;
}

答案 2 :(得分:2)

问题是let关键字,因为 let 具有块级范围,在while循环开始时未定义“数字”

删除while循环中的数字

function digital_root(n) {
  let digits = (""+n).split("").map(Number);
  while (digits.length > 1) {
    let result = digits.reduce((sum, int) => sum + int);
    digits = (""+result).split("").map(Number);
  }
  return digits;
}

console.log(digital_root(47))