大家好!
我目前正在努力获取用户输入并以我的方式对其进行解析。输入代表整数范围或单个整数。 假设我得到以下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语句之前。
有人能指出哪里出了问题吗?如何预防呢?而且,如果有人可以解释为什么会出错,那将是完美的。
谢谢!
答案 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>