Привет 👋,
Уравнение массива – это процесс уменьшения многомерного массива в одномерный массив или с указанными размерами.
Пример:
Вход: [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”