Соревнование

Сглаживайте вложенный массив. Вы должны учитывать различные уровни вложенности.

Не забудьте использовать Чтение-Поиск-Спросить, если вы застряли. Попробуй спарить программу. Напишите свой собственный код.

Вот несколько полезных ссылок:

Начальный код

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]; = 1
arr[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, и вы, как ожидается, будете ее использовать, даже без предложения в разделе полезных ссылок.