我在做freecodecamp的篝火:Chunky Monkey。我几乎有解决方案,但我无法弄清楚它为什么不起作用。所以我的问题是:"为什么会返回[[' a',' b']],而不是[[' a',&# 39,b'],[' C'' d']]?
function chunk(arr, size) {
var array = [];
var tmp = [];
for(var i = 0; i < Math.floor(arr.length/size); i++)
{
for(var j = 0; j < size; j++)
{
tmp.push(arr[j]);
}
array.push(tmp);
tmp = [];
arr.splice(0,size);
}
return array;
}
chunk(['a', 'b', 'c', 'd'], 2);
答案 0 :(得分:3)
因为您正在改变循环中arr
的长度。结果,外循环只运行一次。您需要在更改它之前缓存它:
function chunk(arr, size) {
var array = [];
var tmp = [];
// save this, otherwise the 2nd iteration will not run at all
// because the new array length will be 2, making half of that 1
var iter = Math.floor(arr.length / size);
for (var i = 0; i < iter; i++) {
for (var j = 0; j < size; j++) {
tmp.push(arr[j]);
}
array.push(tmp);
tmp = [];
arr.splice(0, size);
}
return array;
}
答案 1 :(得分:1)
您正在修改每次迭代时arr
的长度,以防止它第二次执行
此外,一个循环就足够了。
function chunk(arr, size) {
var array = [];
for(var i = 0; i < arr.length; i += size) {
array.push(arr.slice(i, i + size));
}
return array;
}
chunk(['a', 'b', 'c', 'd'], 2);
&#13;
答案 2 :(得分:1)
另一种方法:
function chunk(arr, size) {
var array = [];
var tmp = [];
var aux = 0;
for(var i = 0; i < Math.ceil(arr.length/size); i++)
{
for(var j = aux; j < aux + size; j++)
{
arr[j] != undefined?tmp.push(arr[j]):false;
}
aux = aux + size;
array.push(tmp);
tmp = [];
}
return array;
}
console.log(chunk(['a', 'b', 'c', 'd', 'e', 'f'], 2));
PS:它适用于数组中偶数和奇数个元素。
答案 3 :(得分:0)
带循环的可配置块大小示例。
function chunk(arr, chunkSize) {
var array = [];
for (var index = 0, arrLen; index < chunkSize; index++) {
arrLen = arr.length;
if (arrLen >= chunkSize) {
array[index] = arr.splice(0, chunkSize === 1 ? arrLen : chunkSize);
} else if (arrLen > 0) {
array[index] = arr.splice(0, arrLen);
}
}
return array;
}
var result = chunk(['a', 'b', 'c', 'd'], 1);
console.log(result);
答案 4 :(得分:0)
工作代码有很多答案,所以我只回答为什么。
您认为外部循环迭代两次,因为Math.floor(arr.length/size)
在开头是2
:
for(var i = 0; i < Math.floor(arr.length/size); i++) {
// ....
}
但是,arr
在第一次迭代中被分块:
arr.splice(0,size); // arr is ['c', 'd'] after this step
对于第二次迭代,i
变为1
而Math.floor(arr.length/size)
实际上为Math.floor(['c', 'd']/2)
,检查失败并且循环退出。所以不是第二次迭代。