Рубрики
Без рубрики

Массив сплющивания в 5 линиях

Массив сплющивается с уменьшением. Tagged with JavaScript, начинающие, ShowDev, Frontend.

Привет 👋,

Уравнение массива – это процесс уменьшения многомерного массива в одномерный массив или с указанными размерами.

Пример:

Вход: [1, 2, 3, 4, [5, 6]]

Выход: [1, 2, 3, 4, 5, 6]

Мыслительный процесс:

Шаг 1: Мы должны повторить заданный массив. Шаг 2: Для каждого элемента, если это не массив, толкните его в новый массив. Шаг 3: Если это массив повторения шагов с 1 по 3.

Наблюдения:

  • Мы используем вывод одной итерации в следующей, поэтому идея здесь состоит в том, чтобы использовать Array.reduce () Анкет
  • Поскольку существует повторение шагов с 1 по 3 при получении массива в качестве вклада, нам придется сделать рекурсию.

Давайте впадим в кодирование:

function flattenArr(arrToFlatten) {
    return arrToFlatten.reduce((acc, value) => {
      if (value instanceof Array) {
        return acc.concat(flattenArr(value));
      }
      return acc.concat(value);
    }, []);
}

Назовите это как:

const arr = [1, 2, 3, 4, [5, 6]];
flattenArr(arr) // [1, 2, 3, 4, 5, 6]

  • Flattenarr это функция, которая принимает arrtoflatten типа массива как аргумент.
  • Мы возвращаем вывод arrtoflatten.reduce .
  • Пусть начальное значение результата будет пустым массивом []
  • Если текущий вход значение не является экземпляром массива, добавьте его в acc используя concat вспомогательная функция.
  • Если это оказывается экземпляр массив затем позвоните Flattenarr Снова с массивом ( значение ) в качестве параметра, затем concat что с acc Анкет

Итак, теперь, с этим подходом, мы можем уменьшить любой многомерный массив в одномерный массив.

Как насчет случая, когда нам нужно, чтобы он сгладил только до определенных уровней глубоко и что -то вложенное внутри, которое должно оставаться таким, каким он есть?

Это просто, мы получаем другое значение от пользователя в аргументе ( Dexit ).

function flattenArr(arrToFlatten, depth) {
    return arrToFlatten.reduce((acc, value) => {
      if (value instanceof Array && depth > 0) {
        return acc.concat(flattenArr(value, depth - 1));
      }
      return acc.concat(value);
    }, []);
}

Назовите это как:

const arr = [1, 2, 3, 4, [5, 6, [7, 8]]];
flattenArr(arr, 1) // [1, 2, 3, 4, 5, 6, [7, 8]]

  • Добавьте дополнительный параметр глубина и проверьте, превышает ли его значение 0 перед обработкой массива внутри функции уменьшения.

  • Если глубина Значение больше 0 Это означает, что массив должен быть сплющен. Так что рекурсивно вызовите Flattenarr с массивом и Глубина - 1 как мы пошли на одном уровне.

  • Каждый рекурсивный вызов означает, что мы продвигаемся на 1 уровень глубиной, поэтому мы уменьшаем значение глубина на 1

О да, я говорил 5 строк. Ну вот!!!

const flattenArr = (arrToFlatten, depth) => (
    arrToFlatten.reduce((acc, value) => (
      ((value instanceof Array && depth) ? [...acc, ...flattenArr(value, depth - 1)] : [...acc, value])
    ), [])
);

Случаи с краями обработки:

  • Что если первый параметр не является массивом?
  • Что, если глубина не является числом?

Давайте добавим чек:

 const typeOfDepth = typeof(depth);
 if (!(arrToFlatten instanceof Array) || !(typeOfDepth === 'number')) {
    throw new Error('Invalid Argument Supplied');
 }

Как предложил Джордж в комментарии ниже, у нас есть по умолчанию Array.flat () Метод, однако, достичь Поддержка браузера Вам придется получить помощь от ваших транспористов JS, таких как Babel.

Мой Веб -сайт , блоги и Твиттер

Это все люди !!!

Оригинал: “https://dev.to/dhilipkmr/flattening-an-array-in-5-lines-57ca”