为什么会返回[[' a',' b']]而不是[[' a'' b'],[ ' C'' d']]?

时间:2015-07-28 00:34:28

标签: javascript arrays

我在做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);

5 个答案:

答案 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的长度,以防止它第二次执行 此外,一个循环就足够了。

&#13;
&#13;
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;
&#13;
&#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变为1Math.floor(arr.length/size)实际上为Math.floor(['c', 'd']/2),检查失败并且循环退出。所以不是第二次迭代。