220 lines
14 KiB
Markdown
220 lines
14 KiB
Markdown
|
---
|
|||
|
title: Chunky Monkey
|
|||
|
localeTitle: Короткая обезьяна
|
|||
|
---
|
|||
|
![](//discourse-user-assets.s3.amazonaws.com/original/2X/a/aadd6bead83ab7d79a795c326f005a89e6ad81f5.png)
|
|||
|
|
|||
|
![:triangular_flag_on_post:](https://forum.freecodecamp.com/images/emoji/emoji_one/triangular_flag_on_post.png?v=3 ": Triangular_flag_on_post:") Не забудьте использовать **`Read-Search-Ask`** если вы застряли. Попробуйте подключить программу ![:busts_in_silhouette:](https://forum.freecodecamp.com/images/emoji/emoji_one/busts_in_silhouette.png?v=3 ": Busts_in_silhouette:") и напишите свой собственный код ![:pencil:](https://forum.freecodecamp.com/images/emoji/emoji_one/pencil.png?v=3 ":карандаш:")
|
|||
|
|
|||
|
### ![:checkered_flag:](https://forum.freecodecamp.com/images/emoji/emoji_one/checkered_flag.png?v=3 ": 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]]`
|
|||
|
|
|||
|
#### Связанные ссылки
|
|||
|
|
|||
|
* [Array.push ()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/push)
|
|||
|
* [Array.slice ()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/slice)
|
|||
|
|
|||
|
## ![:speech_balloon:](https://forum.freecodecamp.com/images/emoji/emoji_one/speech_balloon.png?v=3 ": Speech_balloon:") Подсказка: 1
|
|||
|
|
|||
|
В приведенных выше ссылках предлагается использовать `Array.push()` , поэтому давайте начнем с создания первого массива для хранения меньших массивов, которые мы скоро получим так:
|
|||
|
|
|||
|
```javascript
|
|||
|
var newArray = [];
|
|||
|
```
|
|||
|
|
|||
|
> _попытаться решить проблему сейчас_
|
|||
|
|
|||
|
## ![:speech_balloon:](https://forum.freecodecamp.com/images/emoji/emoji_one/speech_balloon.png?v=3 ": Speech_balloon:") Подсказка: 2
|
|||
|
|
|||
|
Далее нам понадобится `for loop` для циклического прохождения через `arr` .
|
|||
|
|
|||
|
> _попытаться решить проблему сейчас_
|
|||
|
|
|||
|
## ![:speech_balloon:](https://forum.freecodecamp.com/images/emoji/emoji_one/speech_balloon.png?v=3 ": Speech_balloon:") Подсказка: 3
|
|||
|
|
|||
|
Наконец, нам нужен метод для фактического разделения, и мы можем использовать `Array.slice()` для этого. Ключом к этому алгоритму является понимание того, как все `for loop` , `size` , `Array.slice()` и `Array.push()` работают вместе.
|
|||
|
|
|||
|
> _попытаться решить проблему сейчас_
|
|||
|
|
|||
|
## Осторожно, спойлеры!
|
|||
|
|
|||
|
![предупреждающий знак](//discourse-user-assets.s3.amazonaws.com/original/2X/2/2d6c412a50797771301e7ceabd554cef4edcd74d.gif)
|
|||
|
|
|||
|
**Решение впереди!**
|
|||
|
|
|||
|
## ![:beginner:](https://forum.freecodecamp.com/images/emoji/emoji_one/beginner.png?v=3 ": Начинающий:") Решение базового кода:
|
|||
|
|
|||
|
```javascript
|
|||
|
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:](https://forum.freecodecamp.com/images/emoji/emoji_one/rocket.png?v=3 ": Ракета:") [Код запуска](https://repl.it/CLjU/24)
|
|||
|
|
|||
|
### Код Объяснение:
|
|||
|
|
|||
|
* Во-первых, мы создаем две пустые массивы, называемые `temp` и `result` , которые мы в конечном итоге вернем.
|
|||
|
* Наша **для петли** петли , пока не равно или больше , чем длина массива в нашем тесте. `a`
|
|||
|
* Внутри нашего цикла мы нажимаем `temp` используя `temp.push(arr[a]);` если остальная часть `a / size` не равна `size - 1` .
|
|||
|
* В противном случае мы нажимаем на `temp` , нажимаем `temp` на переменную `result` и сбрасываем `temp` в пустой массив.
|
|||
|
* Затем, если `temp` не пустой массив, мы подталкиваем его к `result` .
|
|||
|
* Наконец, мы возвращаем значение `result` .
|
|||
|
|
|||
|
#### Связанные ссылки
|
|||
|
|
|||
|
* [Array.push ()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/push)
|
|||
|
* [Для циклов](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for)
|
|||
|
|
|||
|
## ![:sunflower:](https://forum.freecodecamp.com/images/emoji/emoji_one/sunflower.png?v=3 ": Подсолнечное:") Решение промежуточного кода:
|
|||
|
|
|||
|
```javascript
|
|||
|
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:](https://forum.freecodecamp.com/images/emoji/emoji_one/rocket.png?v=3 ": Ракета:") [Код запуска](https://repl.it/Cj9x/3)
|
|||
|
|
|||
|
### Код Объяснение:
|
|||
|
|
|||
|
* Сначала мы создаем пустой массив `arr2` где мы будем хранить наши «куски».
|
|||
|
* Цикл for начинается с нуля, каждый раз увеличивается по `size` через цикл и останавливается, когда он достигает `arr.length` .
|
|||
|
* Обратите внимание, что это для цикла не проходит через `arr` . Вместо этого мы используем цикл для генерации чисел, которые мы можем использовать в качестве индексов для срезания массива в правильных местоположениях.
|
|||
|
* Внутри нашего цикла мы создаем каждый фрагмент с помощью `arr.slice(i, i+size)` и добавляем это значение к `arr2` с `arr2.push()` .
|
|||
|
* Наконец, мы возвращаем значение `arr2` .
|
|||
|
|
|||
|
#### Связанные ссылки
|
|||
|
|
|||
|
* [Array.push ()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/push)
|
|||
|
* [Array.slice ()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/slice)
|
|||
|
* [Для циклов](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for)
|
|||
|
|
|||
|
## ![:rotating_light:](https://forum.freecodecamp.com/images/emoji/emoji_one/rotating_light.png?v=3 ": Rotating_light:") Расширенное решение для кода:
|
|||
|
|
|||
|
```javascript
|
|||
|
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:](https://forum.freecodecamp.com/images/emoji/emoji_one/rocket.png?v=3 ": Ракета:") [Код запуска](https://repl.it/CLjU/26)
|
|||
|
|
|||
|
### Код Объяснение:
|
|||
|
|
|||
|
* Во-первых, мы создаем две переменные. `newArr` - пустой массив, на который мы будем нажимать. Мы также имеем переменную `i` равную нулю, для использования в нашем цикле while.
|
|||
|
|
|||
|
* Наш цикл while цикл до тех пор, пока `i` будет равен или больше длины массива в нашем тесте.
|
|||
|
|
|||
|
* Внутри нашего цикла, мы выдвигаем к `newArr` массив с помощью `arr.slice(i, i+size)` . Впервые это петли, это будет выглядеть примерно так:
|
|||
|
|
|||
|
newArr.push (arr.slice (1, 1 + 2))
|
|||
|
|
|||
|
* После нажатия на `newArr` мы добавляем переменную `size` в `i` .
|
|||
|
|
|||
|
* Наконец, мы возвращаем значение `newArr` .
|
|||
|
|
|||
|
|
|||
|
#### Связанные ссылки
|
|||
|
|
|||
|
* [Array.push ()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/push)
|
|||
|
* [Array.slice ()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/slice)
|
|||
|
* [В то время как петли](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Statements/while)
|
|||
|
|
|||
|
## ![:rotating_light:](https://forum.freecodecamp.com/images/emoji/emoji_one/rotating_light.png?v=3 ": Rotating_light:") Расширенное решение кода 2:
|
|||
|
|
|||
|
```javascript
|
|||
|
function chunkArrayInGroups(arr, size) {
|
|||
|
var newArr = [];
|
|||
|
while (arr.length) {
|
|||
|
newArr.push(arr.splice(0,size));
|
|||
|
}
|
|||
|
return newArr;
|
|||
|
}
|
|||
|
```
|
|||
|
|
|||
|
![:rocket:](https://forum.freecodecamp.com/images/emoji/emoji_one/rocket.png?v=3 ": Ракета:") [Код запуска](https://repl.it/CLjU/579)
|
|||
|
|
|||
|
### Код Объяснение:
|
|||
|
|
|||
|
* Во-первых, мы создаем переменную. `newArr` - пустой массив, на который мы будем нажимать.
|
|||
|
* Наше `while` петли петли , пока длина массива в нашем тесте не является 0.
|
|||
|
* Внутри нашего цикла, мы выдвигаем к `newArr` массива с помощью `arr.splice(0, size)` .
|
|||
|
* Для каждой итерации в `while` цикла, он удаляет `size` количество элементов из передней части `arr` и толкать их в виде массива `newArr` .
|
|||
|
* Наконец, мы возвращаем значение `newArr` .
|
|||
|
|
|||
|
#### Связанные ссылки
|
|||
|
|
|||
|
* [Array.push ()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/push)
|
|||
|
* [Array.splice ()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/splice)
|
|||
|
* [В то время как петли](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Statements/while)
|
|||
|
|
|||
|
## ![:rotating_light:](https://forum.freecodecamp.com/images/emoji/emoji_one/rotating_light.png?v=3 ": Rotating_light:") Расширенное решение для кода 3:
|
|||
|
|
|||
|
```javascript
|
|||
|
function chunkArrayInGroups(arr, size) {
|
|||
|
if (arr.length <= size){
|
|||
|
return [arr];
|
|||
|
}
|
|||
|
else {
|
|||
|
return [arr.slice(0,size)].concat(chunkArrayInGroups(arr.slice(size),size));
|
|||
|
}
|
|||
|
}
|
|||
|
```
|
|||
|
|
|||
|
![:rocket:](https://forum.freecodecamp.com/images/emoji/emoji_one/rocket.png?v=3 ": Ракета:") [Код запуска](https://repl.it/CLjU/579)
|
|||
|
|
|||
|
### Код Объяснение:
|
|||
|
|
|||
|
* Массив меньше размера возвращается вложенным.
|
|||
|
* Для любого массива, большего, чем размер, он разбивается на две части. Первый сегмент вложен и согласован со вторым вторым сегментом, который делает рекурсивный вызов.
|
|||
|
|
|||
|
#### Связанные ссылки
|
|||
|
|
|||
|
* [Рекурсия](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Functions#Recursion)
|
|||
|
* [Array.splice ()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/splice)
|
|||
|
|
|||
|
## ![:clipboard:](https://forum.freecodecamp.com/images/emoji/emoji_one/clipboard.png?v=3 ": Буфер обмена:") ПРИМЕЧАНИЯ ДЛЯ ВЗНОСОВ:
|
|||
|
|
|||
|
* ![:warning:](https://forum.freecodecamp.com/images/emoji/emoji_one/warning.png?v=3 ":предупреждение:") **НЕ** добавляйте решения, похожие на любые существующие решения. Если вы считаете, что это **_похоже, но лучше_** , попробуйте объединить (или заменить) существующее подобное решение.
|
|||
|
* Добавьте объяснение своего решения.
|
|||
|
* Классифицируйте решение в одной из следующих категорий - **Basic** , **Intermediate** и **Advanced** . ![:traffic_light:](https://forum.freecodecamp.com/images/emoji/emoji_one/traffic_light.png?v=3 ":светофор:")
|
|||
|
* Пожалуйста, добавьте свое имя пользователя, только если вы добавили **соответствующее основное содержимое** . ( ![:warning:](https://forum.freecodecamp.com/images/emoji/emoji_one/warning.png?v=3 ":предупреждение:") **_НЕ_** _удаляйте существующие имена пользователей_ )
|
|||
|
|
|||
|
> Увидеть ![:point_right:](https://forum.freecodecamp.com/images/emoji/emoji_one/point_right.png?v=3 ": Point_right:") [**`Wiki Challenge Solution Template`**](http://forum.freecodecamp.com/t/algorithm-article-template/14272) для [**`Wiki Challenge Solution Template`**](http://forum.freecodecamp.com/t/algorithm-article-template/14272) для справки.
|