Array.reduce奇怪的行为

时间:2018-10-30 08:44:11

标签: javascript arrays types reduce

大家好!

我目前正在努力获取用户输入并以我的方式对其进行解析。输入代表整数范围或单个整数。 假设我得到以下range数组:

const ranges = [`1-6`, `8`, `12-20-18`, `22-21`, `46-42-44`];

现在我需要一个完整的整数列表,所以我写了这个块:

const list = ranges.reduce ((array, range) => {
    console.log (array);
    if (!range.incldues (`-`)) return array.push (parseInt (range)); // Single integer
    const milestones = range.split (`-`).map (milestone => parseInt (milestone)),
        min = Math.min (...milestones),
        max = Math.max (...milestones);
    for (let i = min; i <= max; i++) array.push (i);
    console.log (array);
    return array;
}, []);

问题是我突然得到了“ Uncaught TypeError:array.push不是一个函数”,console.logging我的变量显示,在第一次reduce迭代之后,array的值是(int)7,尽管它只是一个数组在return语句之前。

Here is an illustration of it

有人能指出哪里出了问题吗?如何预防呢?而且,如果有人可以解释为什么会出错,那将是完美的。

谢谢!

1 个答案:

答案 0 :(得分:4)

两个问题:

  • 方法名称为.includes(不是incldues
  • Array.prototype.push返回数组的新长度,而不是数组本身。首先使用push,然后在下一行使用return array

修复这些问题,它可以按预期工作:

const ranges = [`1-6`, `8`, `12-20-18`, `22-21`, `46-42-44`];
const list = ranges.reduce((array, range) => {
  if (!range.includes(`-`)) {
    array.push(parseInt(range)); // Single integer
    return array;
  }
  const milestones = range.split(`-`).map(Number),
    min = Math.min(...milestones),
    max = Math.max(...milestones);
  for (let i = min; i <= max; i++) array.push(i);
  return array;
}, []);
console.log(list);

请注意,由于Number函数将非数字转换为数字,因此您可以简单地将其传递给.map而不是使用.map (milestone => parseInt (milestone))(有点罗y)。 / p>