Я описываю испытание Коренастая обезьяна на FreeCodeCamp. Как я это решаю.
Наша цель для этого алгоритма — разбить arr
(первый аргумент) на более мелкие фрагменты массивов с длиной, предоставленной size
(второй аргумент). Наш код должен пройти 4 зеленые проверки (цели), чтобы завершить этот алгоритм:
- Ожидается, что
(['a', 'b', 'c', 'd'], 2)
будет[['a', 'b'], ['c', 'd']]
- Ожидается, что
([0, 1, 2, 3, 4, 5], 3)
будет[[0, 1, 2], [3, 4, 5]]
- Ожидается, что
([0, 1, 2, 3, 4, 5], 2)
будет[[0, 1], [2, 3], [4, 5]]
- Ожидается, что
([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)
Теперь мне нужно более внимательно присмотреться к тому, как писать операторы равенства с оператором взрыва. Я думал, что !=== должно работать.
Итак, следующий вызов. А не ___ ли нам?