大家好!
我目前正在努力获取用户输入并按照我的方式解析它。输入表示整数范围或单个整数。 假设我得到以下范围数组:
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 语句之前。
有人能指出哪里出了问题吗?如何防止它这样做?此外,如果有人能解释为什么会出错,那就完美了。
谢谢!
最佳答案
两个问题:
- 方法名称为
.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/