Соревнование
Сглаживайте вложенный массив. Вы должны учитывать различные уровни вложенности.
Не забудьте использовать Чтение-Поиск-Спросить, если вы застряли. Попробуй спарить программу. Напишите свой собственный код.
Вот несколько полезных ссылок:
Начальный код
function steamrollArray(arr) { // I'm a steamroller, baby return arr; } steamrollArray([1, [2], [3, [[4]]]]);
Что это значит
Этот кажется проще, чем есть на самом деле. На самом деле заслуга в этом принадлежит Мистеру Сноу.
Мы передаем наш аргумент [1, [2], [3, [[4]]]]
, который представляет собой массив с другими массивами, вложенными на разных этапах. Нам нужно вернуть просто один массив без вложенности [1, 2, 3, 4]
Обдумывая это
Теперь наш аргумент выглядит немного странно, поэтому для большей ясности давайте вернемся к каждому элементу нашего тестового примера.
arr[0];
= 1arr[1]
= [2]arr[2]
= [3,[[4]]]
Хм, моей первой реакцией было запустить for
циклы и concat
, но, поскольку нам пришлось бы вкладывать цикл в цикл с неопределенностью относительно того, сколько массивов находится в нашем элементе, это был не вариант.
Для каждого
Я не использую forEach
так часто, но вот идеальный случай для этого.
Основная проблема этого алгоритма заключается в том, что мы не знаем, сколько массивов нам нужно использовать, чтобы найти наш элемент. Итак, мы можем использовать forEach
с некоторой логикой, чтобы сделать что-то if
утверждение истинно.
if(!Array.isArray(item)) { newArray.push(item); }
Итак, здесь мы используем предложенный метод Array.isArray()
. Которая принимает аргумент и дает вам ответ true
или false
. Сообщая вам, является ли элемент, который вы ему передали, массивом или нет.
Итак, для каждого элемента, переданного в нашу функцию, ее спрашивают, не ли это массив, если это не идеальный массив, давайте push
превратим его в массив.
Теперь мы создали новую переменную, которая содержит пустой массив вне нашей функции сглаживания.
Тогда if
наш item
не массив (!Array.isArray(item))
, тогда мы можем отправить этот элемент в наш newArray
.
Почти готово
Итак, если наш элемент не является массивом, который мы покрываем, но что, если это массив?
Что ж, это та часть, к которой нас не подготовил freeCodeCamp. Нам нужно сделать рекурсию.
Рекурсия использует нашfunction flatten();
в нашем function flatten();
Это правильно, создав цикл, который снова возвращает нас к запуску нашей функции. Однако на этот раз мы не передадим наш arr
снова, мы передадим наш item
.
Итак, вернем вас немного назад. arr[0]
не массив, это число 1, . Таким образом, он будет помещен в массив newArray.push(item);
, однако arr[1]
- это массив, это [2] . Это массив с одним элементом, номером 2. Таким образом, это должно будет пройти через нашу функцию сглаживания как таковую (как item
или arr[1]
, а не целиком arr
).
Теперь, если наш элемент не является массивом (Пример, если arr [1] не является массивом, отправьте arr [1] в flatten();
Итак, тогда flatten может спросить, является ли item[0]
в arr[1]
массивом, и процесс начнется снова. Пока все элементы не являются массивами и мы доходим до конца цикла forEach
.
Затем нам нужно вызвать функцию flatten(arr);
и добавить наш оператор return
для нашего newArray
.
Окончательный код
function steamrollArray(arr) { var newArray = []; function flatten(arr) { arr.forEach(function(item) { if (!Array.isArray(item)) { newArray.push(item); } else { flatten(item); } }); } flatten(arr); return newArray; } steamrollArray([1, [2], [3, [[4]]]]);
И мы готовы
Надеюсь, это помогло вам лучше понять эту проблему. Мы будем очень благодарны за любые советы о том, как я могу улучшить эти статьи о решениях, и если у вас есть решение, отличное от моего, не стесняйтесь поделиться в комментариях ниже.
Еще раз хочу отдать должное Мистеру Сноу, в этом я бы ни за что не попал. Очень жаль, что рекурсия не появилась в курсе freeCodeCamp, и вы, как ожидается, будете ее использовать, даже без предложения в разделе полезных ссылок.