Javascript 为什么会返回[&"x27;a&"x27;、&"x27;b&"x27;],而不是[&&&"x27;a&&"x27;、&"x27;b&&"x27;]、[&&"x27;c&&"x27;、&&"d&"?

Javascript 为什么会返回[&"x27;a&"x27;、&"x27;b&"x27;],而不是[&&&"x27;a&&"x27;、&"x27;b&&"x27;]、[&&"x27;c&&"x27;、&&"d&"?,javascript,arrays,Javascript,Arrays,我在做freecodecamp的篝火:矮胖的猴子。我几乎找到了解决方案,但我不明白为什么它不起作用。所以我的问题是:“为什么这个返回[['a','b']],而不是[['a','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 <

我在做freecodecamp的篝火:矮胖的猴子。我几乎找到了解决方案,但我不明白为什么它不起作用。所以我的问题是:“为什么这个返回[['a','b']],而不是[['a','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);
功能块(arr,大小){
var数组=[];
var tmp=[];
对于(变量i=0;i
因为您正在更改循环内
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;
}
功能块(arr,大小){
var数组=[];
var tmp=[];
//保存这个,否则第二次迭代根本不会运行
//因为新的数组长度是2,等于1的一半
var iter=数学地板(长度/尺寸);
对于(var i=0;i
因为您正在更改循环内
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;
}
功能块(arr,大小){
var数组=[];
var tmp=[];
//保存这个,否则第二次迭代根本不会运行
//因为新的数组长度是2,等于1的一半
var iter=数学地板(长度/尺寸);
对于(var i=0;i
您正在修改每次迭代的
arr
长度,以防止其第二次执行。
此外,一个循环就足够了

功能块(arr,大小){
var数组=[];
对于(变量i=0;i块(['a','b','c','d'],2);
您在每次迭代中修改
arr
的长度,以防止其第二次执行。
此外,一个循环就足够了

功能块(arr,大小){
var数组=[];
对于(变量i=0;i块(['a','b','c','d'],2);
带有循环的可配置块大小示例

功能块(arr,chunkSize){
var数组=[];
对于(var index=0,arrLen;index=chunkSize){
数组[index]=arr.splice(0,chunkSize==1?arrLen:chunkSize);
}否则如果(arrLen>0){
阵列[索引]=阵列拼接(0,阵列);
}
}
返回数组;
}
var result=chunk(['a','b','c','d'],1);

console.log(result);
带有循环的可配置块大小示例

功能块(arr,chunkSize){
var数组=[];
对于(var index=0,arrLen;index=chunkSize){
数组[index]=arr.splice(0,chunkSize==1?arrLen:chunkSize);
}否则如果(arrLen>0){
阵列[索引]=阵列拼接(0,阵列);
}
}
返回数组;
}
var result=chunk(['a','b','c','d'],1);
console.log(结果);
另一种方法:

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));
功能块(arr,大小){
var数组=[];
var tmp=[];
var-aux=0;
对于(变量i=0;i
PS:它适用于数组中的偶数和奇数个元素。

另一种方法:

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));
功能块(arr,大小){
var数组=[];
var tmp=[];
var-aux=0;
对于(变量i=0;i

PS:它适用于数组中的偶数和奇数个元素。

有很多关于工作代码的答案,所以我只回答为什么

您认为外部循环会重复两次,因为
Math.floor(arr.length/size)
在开始时是
2

for(var i = 0; i < Math.floor(arr.length/size); i++) {
    // ....
}

对于第二次迭代,
i
变为
1
Math.floor(arr.length/size)
实际上是
Math.floor(['c','d']/2)
,检查失败,循环退出。因此没有第二次迭代。

很多答案都是工作代码,所以我只是回答为什么

您认为外部循环会重复两次,因为
Math.floor(arr.length/size)
在开始时是
2

for(var i = 0; i < Math.floor(arr.length/size); i++) {
    // ....
}

对于第二次迭代,
i
变为
1
,而
Math.floor(arr.length/size)
实际上是
Math.floor(['c','d']/2)
,检查失败,循环退出。因此没有第二次迭代。

因为只有一个
tmp
。你的意思是['a','b',['c','d']?@HashPsi在第一个循环中移动tmp并不能修复它。只是为了好玩:只是为了好玩v2:因为只有一个
tmp
。你是说[['a','b',['c','d']]?@HashPsi在第一个循环中移动tmp并不能修复它。只是为了好玩:只是为了好玩v2:请解释下一票。请解释下一票。您不需要条件,
a