javascript - Array.reduce 奇怪的行为

标签 javascript arrays types reduce

大家好!

我目前正在努力获取用户输入并按照我的方式解析它。输入表示整数范围或单个整数。 假设我得到以下范围数组:

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

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

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 is not a function”并且console.logging我的变量显示在第一次reduce迭代之后,数组的值是(int) 7,尽管它只是一个数组在 return 语句之前。

Here is an illustration of it

有人能指出哪里出了问题吗?如何防止它这样做?此外,如果有人能解释为什么会出错,那就完美了。

谢谢!

最佳答案

两个问题:

  • 方法名称为 .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 (里程碑=> parseInt (milestone)) (有点罗嗦)。

关于javascript - Array.reduce 奇怪的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53060376/

相关文章:

javascript - 如何提高 UTF32 到 UTF16 代理对转换器的性能

c - 如何在 C 中打印空数组元素/跳过数组元素?

php - 如何在数组 php 中找到最后一次出现的 "needle"

java - 在存储在 XML 中的对象周围使用无类型包装器类,这不好吗?

javascript - 更新后的状态值不会反射(reflect)在 React 的 setInterval() 内部

javascript:执行 http post 并在另一个页面/选项卡上查看其响应的好方法是什么?

javascript - 确定 execScript 抛出错误的原因

C - I/O - 用于打印句子结构的字符数组

types - 你能比较Lua中表或元表的 "types"吗?

Typescript 无法解析联合类型的属性