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

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

0 голосов
/ 30 октября 2018

Привет всем!

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

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 моих переменных показал, что после первой итерации сокращения массив принял значение (int) 7, несмотря на то, что массив просто перед оператором возврата.

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

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

Спасибо!

1 Ответ

0 голосов
/ 30 октября 2018

Два выпуска:

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

...