我正在解决FreeCodeCamp的挑战,并且我坚持下面的一个:
我们对此算法的目标是将arr(第一个参数)拆分为 较小的数组块,长度由大小提供(第二个 参数)。我们的代码需要几个绿色检查(目标) 传递以完成此算法:
([' 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]]
([0,1,2,3,4,5,6,7,8],2)预计会返回[[0,1],[2,3], [4,5],[6,7],[8]]。
以下是我提出的代码:
function chunkArrayInGroups(arr, size) {
var newArray = [];
var holdArray = [];
for (var i = 0; i <= arr.length; i += size) {
holdArray = arr.slice(0, size);
removed = arr.splice(0, size);
newArray.push(holdArray);
}
if (arr.length !== 0) {
newArray.push(arr);
return newArray;
}
else return newArray;
}
chunkArrayInGroups([0, 1, 2, 3, 4, 5, 6, 7, 8], 2);
该算法适用于所有目标,但最后一个目标除外。而不是返回:
[[0,1],[2,3],[4,5],[6,7],[8]]
它回来了:
[[0,1],[2,3],[4,5],[6,7,8]] - 我无法解释原因。
任何有助于解决我出错的地方的帮助都会非常感激!
答案 0 :(得分:0)
我不会因为困惑而责备你,我花了一段时间才发现问题。
首先确定您的for
循环有点奇怪 - 您没有使用i
变量进行任何操作。另外,你在每次迭代时都是splice()
- 原始数组,所以你的意图是正确的 - 等到数组中剩下少于size
个元素。
所以我表示这是一个while
循环,而且瞧,它的确有效:
function chunkArrayInGroups(arr, size) {
var newArray = [];
var holdArray = [];
while (arr.length >= size) {
holdArray = arr.slice(0, size);
removed = arr.splice(0, size);
newArray.push(holdArray);
}
if (arr.length !== 0) {
newArray.push(arr);
return newArray;
}
else return newArray;
}
chunkArrayInGroups([0, 1, 2, 3, 4, 5, 6, 7, 8], 2);
答案 1 :(得分:0)
你一次又一次地重新计算长度,但是你忘了你实际上是从arr中删除元素,所以长度不会与大小增加长度减少相同,要么你可以给出while循环或者保持原始长度在变量中并检查
function chunkArrayInGroups(arr,size){
var newArray = [];
var holdArray = [];
var length=arr.length;
for (var i = 0; i <=length; i += size) {
holdArray = arr.slice(0, size);
removed = arr.splice(0, size);
newArray.push(holdArray);
}
if (arr.length !== 0) {
newArray.push(arr);
return newArray;
}
else return newArray;
}
chunkArrayInGroups([0, 1, 2, 3, 4, 5, 6, 7, 8], 2);