Я описываю испытание Коренастая обезьяна на FreeCodeCamp. Как я это решаю.

Наша цель для этого алгоритма — разбить 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]]

Это то, что должен делать код.

function chunkArrayInGroups(arr, size) {
 var groupArray = [];
 
 // this if statement creates a correct number of indexes for pushing subarrays.
 if (arr.length % size === 0 ) {
 groupArray = new Array(arr.length / size);
 } else {
 groupArray = new Array(Math.floor(arr.length/size) + 1);
 }
 
// groupArray.push([] * groupArray.length)
// new Array(8) will give you an array with the length of 8.
// But those 8 objects. Will be undefined.
// At some point I was trying to loop over the array
// to push the arr.slice. What I got was a mistake.
 var begin = 0; // this would serve as the beginnig parameter in slice.
 var end = 0;
 for (var a = 0; a < groupArray.length; a++) {
 groupArray[a] = [];
 }
 console.log(groupArray);
 for (var i = 0; i < groupArray.length; i++) {
 end = end + size;
 groupArray[i].push(arr.slice(begin, end));
 begin = begin + size;
 console.log(groupArray);
 }
}
chunkArrayInGroups([“a”, “b”, “c”, “d”, “e”, “f”, “g”, “i”, “o”, “w”], 3);

Этот код дает такой вывод

[[["a", "b", "c"]], [["d", "e", "f"]], [["g", "i", "o"]], [["w"]]]

В настоящее время. Я просто попытаюсь удалить оператор if. Потому что это не нужно. Поэтому я должен удалить для также.

for (var a = 0; a < groupArray.length; a++) {
 groupArray[a] = [];
} // gone...

Итак, я удалил его, и он не работает, потому что он есть в моем выражении for.

i < groupArray.length

Длина groupArray на данный момент равна 0, и он не зацикливается. Я должен использовать другое выражение. Тот, что был в операторе if.

На самом деле, я должен оставить оператор IF, но немного изменить его.

Теперь я создал оператор if, который даст мне итератор.

var iterator = 0;
 
 // this supposed to give the number of iterations for the for loop.
 if (arr.length % size !=== 0) {
 iterator = Math.floor(arr.length/size) + 1;
 } else {
 iterator = Math.floor(arr.length/size);
 }

Но JSBin выдает мне ошибку: «Ожидал идентификатор, а вместо него увидел =»

О 😓, надо разобраться.

Ура 👏 Я решил это. Вот решение. ОСТОРОЖНО, СПОЙЛЕРЫ. 👽

function chunkArrayInGroups(arr, size) {
  var groupArray = [];
  var iterator = 0;
  
  // this supposed to give the number of iterations for the for loop.
  if (arr.length % size !== 0) {
    iterator = Math.floor(arr.length/size) + 1;
  } else {
    iterator = Math.floor(arr.length/size);
  }
  
  
  var begin = 0; // this would serve as the beginnig parameter in slice.
  var end = 0;
  
  for (var i = 0; i < iterator; i++) {
    end = end + size;
    groupArray.push(arr.slice(begin, end));
    begin = begin + size;
  }
  return groupArray;
}
chunkArrayInGroups(["a", "b", "c", "d", "e", "f", "g", "i", "o", "w"], 3);

Ошибка была

if (arr.length % size !=== 0) 

должно быть двойное равно

if (arr.length % size !== 0)

Теперь мне нужно более внимательно присмотреться к тому, как писать операторы равенства с оператором взрыва. Я думал, что !=== должно работать.

Итак, следующий вызов. А не ___ ли нам?