freeCodeCamp/guide/russian/certifications/javascript-algorithms-and-d.../basic-algorithm-scripting/chunky-monkey/index.md

14 KiB
Raw Blame History

title localeTitle
Chunky Monkey Короткая обезьяна

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

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

Наша цель для этого алгоритма состоит в том, чтобы разделить arr (первый аргумент) на более мелкие куски массивов с длиной, предоставленной size (второй аргумент). Для завершения этого алгоритма необходимо выполнить 4 зеленых проверки (цели), которые необходимо выполнить нашему коду:

  1. (['a', 'b', 'c', 'd'], 2) ожидается [['a', 'b'], ['c', 'd']]
  2. ([0, 1, 2, 3, 4, 5], 3) ожидается [[0, 1, 2], [3, 4, 5]]
  3. ([0, 1, 2, 3, 4, 5], 2) ожидается [[0, 1], [2, 3], [4, 5]]
  4. ([0, 1, 2, 3, 4, 5], 4) ожидается [[0, 1, 2, 3], [4, 5]]

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

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

В приведенных выше ссылках предлагается использовать Array.push() , поэтому давайте начнем с создания первого массива для хранения меньших массивов, которые мы скоро получим так:

    var newArray = []; 

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

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

Далее нам понадобится for loop для циклического прохождения через arr .

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

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

Наконец, нам нужен метод для фактического разделения, и мы можем использовать Array.slice() для этого. Ключом к этому алгоритму является понимание того, как все for loop , size , Array.slice() и Array.push() работают вместе.

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

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

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

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

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

    function chunkArrayInGroups(arr, size) { 
 
      var temp = []; 
      var result = []; 
 
      for (var a = 0; a < arr.length; a++) { 
        if (a % size !== size - 1) 
          temp.push(arr[a]); 
        else { 
          temp.push(arr[a]); 
          result.push(temp); 
          temp = []; 
        } 
      } 
 
      if (temp.length !== 0) 
        result.push(temp); 
      return result; 
    } 

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

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

  • Во-первых, мы создаем две пустые массивы, называемые temp и result , которые мы в конечном итоге вернем.
  • Наша для петли петли , пока не равно или больше , чем длина массива в нашем тесте. a
  • Внутри нашего цикла мы нажимаем temp используя temp.push(arr[a]); если остальная часть a / size не равна size - 1 .
  • В противном случае мы нажимаем на temp , нажимаем temp на переменную result и сбрасываем temp в пустой массив.
  • Затем, если temp не пустой массив, мы подталкиваем его к result .
  • Наконец, мы возвращаем значение result .

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

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

    function chunkArrayInGroups(arr, size) { 
      // Break it up. 
      var arr2 = []; 
      for (var i = 0; i < arr.length; i+=size) { 
        arr2.push(arr.slice(i , i+size)); 
      } 
      return arr2; 
    } 

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

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

  • Сначала мы создаем пустой массив arr2 где мы будем хранить наши «куски».
  • Цикл for начинается с нуля, каждый раз увеличивается по size через цикл и останавливается, когда он достигает arr.length .
  • Обратите внимание, что это для цикла не проходит через arr . Вместо этого мы используем цикл для генерации чисел, которые мы можем использовать в качестве индексов для срезания массива в правильных местоположениях.
  • Внутри нашего цикла мы создаем каждый фрагмент с помощью arr.slice(i, i+size) и добавляем это значение к arr2 с arr2.push() .
  • Наконец, мы возвращаем значение arr2 .

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

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

    function chunkArrayInGroups(arr, size) { 
      // Break it up. 
      var newArr = []; 
      var i = 0; 
 
      while (i < arr.length) { 
        newArr.push(arr.slice(i, i+size)); 
        i += size; 
      } 
      return newArr; 
    } 
    chunkArrayInGroups(["a", "b", "c", "d"], 2); 

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

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

  • Во-первых, мы создаем две переменные. newArr - пустой массив, на который мы будем нажимать. Мы также имеем переменную i равную нулю, для использования в нашем цикле while.

  • Наш цикл while цикл до тех пор, пока i будет равен или больше длины массива в нашем тесте.

  • Внутри нашего цикла, мы выдвигаем к newArr массив с помощью arr.slice(i, i+size) . Впервые это петли, это будет выглядеть примерно так:

    newArr.push (arr.slice (1, 1 + 2))

  • После нажатия на newArr мы добавляем переменную size в i .

  • Наконец, мы возвращаем значение newArr .

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

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

    function chunkArrayInGroups(arr, size) { 
      var newArr = []; 
      while (arr.length) { 
        newArr.push(arr.splice(0,size)); 
      } 
      return newArr; 
    } 

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

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

  • Во-первых, мы создаем переменную. newArr - пустой массив, на который мы будем нажимать.
  • Наше while петли петли , пока длина массива в нашем тесте не является 0.
  • Внутри нашего цикла, мы выдвигаем к newArr массива с помощью arr.splice(0, size) .
  • Для каждой итерации в while цикла, он удаляет size количество элементов из передней части arr и толкать их в виде массива newArr .
  • Наконец, мы возвращаем значение newArr .

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

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

    function chunkArrayInGroups(arr, size) { 
      if (arr.length <= size){ 
        return [arr]; 
      } 
      else { 
        return [arr.slice(0,size)].concat(chunkArrayInGroups(arr.slice(size),size)); 
      } 
    } 

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

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

  • Массив меньше размера возвращается вложенным.
  • Для любого массива, большего, чем размер, он разбивается на две части. Первый сегмент вложен и согласован со вторым вторым сегментом, который делает рекурсивный вызов.

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

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

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

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