Array.reduce странное поведение

Всем привет !

В настоящее время я работаю над тем, чтобы ввести пользовательский ввод и проанализировать его по-своему. Входные данные представляют собой целые диапазоны или отдельные целые числа. Скажем, я получил следующий массив диапазонов:

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, несмотря на то, что он был массивом непосредственно перед возвратом. утверждение.

Вот иллюстрация этого

Может ли кто-нибудь указать, где что-то пошло не так? Как предотвратить это? Более того, если бы кто-нибудь мог объяснить, ПОЧЕМУ все пошло не так, это было бы идеально.

Спасибо !

вам не нужен специальный чехол if (!range.incldues (-)), код будет работать и без него.

Thomas 30.10.2018 10:16
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
1
65
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Две проблемы:

  • Имя метода - .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)) (что немного многословно).

Хорошо спасибо ! (включает в себя опечатку, которую я допустил при создании этого вопроса, ее не было в коде). Я не знал, что он только что вернул длину массива, и теперь он действительно работает правильно. Был действительно новый вопрос :( Еще раз спасибо;)

Jleu 30.10.2018 09:59

Другие вопросы по теме