Всем привет !
В настоящее время я работаю над тем, чтобы ввести пользовательский ввод и проанализировать его по-своему. Входные данные представляют собой целые диапазоны или отдельные целые числа. Скажем, я получил следующий массив диапазонов:
const ranges = [`1-6`, `8`, `12-20-18`, `22-21`, `46-42-44`];
Теперь мне нужен полный список целых чисел, поэтому я написал этот кусок:
const list = ranges.reduce ((array, range) => {
console.info (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.info (array);
return array;
}, []);
Дело в том, что я быстро получил «Uncaught TypeError: array.push is not a function», и console.infoging мои переменные показали, что после первой итерации сокращения массив принял значение (int) 7, несмотря на то, что он был массивом непосредственно перед возвратом. утверждение.
Может ли кто-нибудь указать, где что-то пошло не так? Как предотвратить это? Более того, если бы кто-нибудь мог объяснить, ПОЧЕМУ все пошло не так, это было бы идеально.
Спасибо !



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Две проблемы:
.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.info(list);Обратите внимание: поскольку функция Number преобразует нечисловое число в число, вы можете просто передать его в .map, а не использовать .map (milestone => parseInt (milestone)) (что немного многословно).
Хорошо спасибо ! (включает в себя опечатку, которую я допустил при создании этого вопроса, ее не было в коде). Я не знал, что он только что вернул длину массива, и теперь он действительно работает правильно. Был действительно новый вопрос :( Еще раз спасибо;)
вам не нужен специальный чехол
if (!range.incldues (-)), код будет работать и без него.