freeCodeCamp/guide/russian/certifications/javascript-algorithms-and-d.../intermediate-algorithm-scri.../steamroller/index.md

9.8 KiB
Raw Blame History

title localeTitle
Steamroller пробиваться с боями

:triangular_flag_on_post: Не забудьте использовать Read-Search-Ask если вы застряли. Попробуйте подключить программу :busts_in_silhouette: и напишите свой собственный код :pencil:

:checkered_flag: Проблема Объяснение:

Эта проблема кажется простой, но вам нужно обязательно сгладить любой массив, независимо от уровня, который добавляет немного сложности в проблему.

Связанные ссылки

:speech_balloon: Подсказка: 1

Вам нужно проверить, является ли элемент массивом или нет.

попытаться решить проблему сейчас

:speech_balloon: Подсказка: 2

Если вы имеете дело с массивом, то вам нужно сгладить его, получив значение внутри массива. Это означает, что если у вас есть [4]], а вместо возврата [4] вам нужно вернуться 4. Если вы получите [[[4]]] то то же самое, вы хотите 4. Вы можете получить к нему доступ с помощью arr [index1] [index2], чтобы перейти на более глубокий уровень.

попытаться решить проблему сейчас

! [: speech_balloon: Подсказка: 3

Вам определенно потребуется рекурсия или другой способ выйти за пределы двух уровней, чтобы сделать код гибким и не жестко закодированным для ответов. Повеселись!

попытаться решить проблему сейчас

Осторожно, спойлеры!

предупреждающий знак

Решение впереди!

:beginner: Решение базового кода:

function steamrollArray(arr) { 
  var flattenedArray = []; 
 
  // Create function that adds an element if it is not an array. 
  // If it is an array, then loops through it and uses recursion on that array. 
  var flatten = function(arg) { 
    if (!Array.isArray(arg)) { 
      flattenedArray.push(arg); 
    } else { 
      for (var a in arg) { 
        flatten(arg[a]); 
      } 
    } 
  }; 
 
  // Call the function for each element in the array 
  arr.forEach(flatten); 
  return flattenedArray; 
 } 
 
 // test here 
 steamrollArray([1, [2], [3, [[4]]]]); 

:rocket: Код запуска

Код Объяснение:

  • Создайте новую переменную, чтобы сохранить сплющенные массивы.
  • Создайте функцию, которая добавит элементы без массива в новую переменную, а для тех, которые являются массивом, она проходит через них, чтобы получить элемент.
  • Это делает это с помощью рекурсии, если элемент является массивом, то снова вызовите функцию со слоем массива, чтобы проверить, является ли это массивом или нет. если это не так, то нажмите этот элемент без массива на возвращаемую переменную. В противном случае продолжайте идти глубже.
  • Вызовите функцию, в первый раз, когда вы всегда будете передавать ей массив, поэтому он всегда попадает в ветку isArray
  • Верните сплющенный массив.

Связанные ссылки

:sunflower: Решение промежуточного кода:

function steamrollArray(arr) { 
  let flat = [].concat(...arr); 
  return flat.some(Array.isArray) ? steamrollArray(flat) : flat; 
 } 
 
 flattenArray([1, [2], [3, [[4]]]]); 

:rocket: Код запуска

Код Объяснение:

  • Используйте оператор spread, чтобы объединить каждый элемент arr с пустым массивом
  • Используйте Array.some() чтобы узнать, содержит ли новый массив массив
  • Если это так, снова используйте рекурсивный вызов steamrollArray , передав новый массив, чтобы повторить процесс на массивах, которые были глубоко вложены
  • Если это не так, верните сплющенный массив

Связанные ссылки

:rotating_light: Расширенное решение для кода:

function steamrollArray(arr) { 
  return arr.toString() 
    .replace(',,', ',')       // "1,2,,3" => "1,2,3" 
    .split(',')               // ['1','2','3'] 
    .map(function(v) { 
      if (v == '[object Object]') { // bring back empty objects 
        return {}; 
      } else if (isNaN(v)) {        // if not a number (string) 
        return v; 
      } else { 
        return parseInt(v);         // if a number in a string, convert it 
      } 
    }); 
 } 

:rocket: Код запуска

Код Объяснение:

  • Сначала мы преобразуем массив в строку, которая даст нам строку чисел, разделенную запятой, двойную запятую, если бы был пустой массив и литеральный текст объекта, если был объект, который мы можем исправить позже в нашем операторе if ,
  • Мы заменяем двойную запятую на одну, а затем разбиваем на массив.
  • сопоставить массив и исправить значения объекта и преобразовать строки в обычные числа.

:clipboard: ПРИМЕЧАНИЯ ДЛЯ ВЗНОСОВ:

  • :warning: НЕ добавляйте решения, похожие на любые существующие решения. Если вы считаете, что это похоже, но лучше , попробуйте объединить (или заменить) существующее подобное решение.
  • Добавьте объяснение своего решения.
  • Классифицируйте решение в одной из следующих категорий - Basic , Intermediate и Advanced . :traffic_light:

Увидеть :point_right: Wiki Challenge Solution Template для Wiki Challenge Solution Template для справки.