将数组分成组 - 我的代码有什么问题?

3
以下是代码:
function chunkArrayInGroups(arr, size) {
  // Break it up.
  var newArr =[];
  for(var i = 0;i < arr.length;i++){
    for(var j = 0;j < size;j++){
      newArr.push(arr.splice(0,size));
    }
  }
  var result = [];
  for(i = 0;i < newArr.length;i++){
    if(newArr[i].length != 0){
      result.push(newArr[i]);
    }
  }
  return result;
}

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]]。另外,如果我的输入数组是([0,1,2,3,4,5,6,7,8,9,10],2),那么我的代码会像预期的那样返回。
附言:我特别想知道这段代码有什么问题,而不是采用其他代码/方法。

什么问题? - sumeet kumar
2
您的实际输出和期望输出相同。是否打错了? - Jared Smith
3个回答

1
基本上你只需要一个循环,因为你会切割数组并取出所需大小的一块。
这种行为可以用于循环直到数组长度为零并退出循环。
在这种情况下,结果已经准备好了。

function chunkArrayInGroups(arr, size) {
    var newArr = [];
    // for (var i = 0; i < arr.length; i++) {
    while (arr.length) {                        // add this for looping and checking
        // for (var j = 0; j < size; j++) {
        newArr.push(arr.splice(0, size));       // keep this for doing the work!
        // }
    }
    // var result = [];
    // for (i = 0; i < newArr.length; i++) {
    //     if (newArr[i].length != 0) {
    //         result.push(newArr[i]);
    //     }
    // }
    // return result;
    return newArr;                              // return only newArray
}

console.log(chunkArrayInGroups([0, 1, 2, 3, 4, 5, 6, 7, 8], 2));
.as-console-wrapper { max-height: 100% !important; top: 0; }


0
你可以直接做以下操作:
var size = 2;
var arr = [0,1,2,3,4,5,6,7,8];
var newArray = [];
for(var i = 0; i < arr.length; i+=size){
    newArray.push(arr.slice(i,i+size))
}
console.log(newArray); //will output [[0,1],[2,3],[4,5],[6,7],[8]]

0
你的问题在于没有处理剩余数组长度小于给定size的情况,换句话说,当arr.length < size时,数组中剩余的项将不会计入块数组。
你需要对此进行测试,我已经更新了你的代码,所以它可以完美运行:
function chunkArrayInGroups(arr, size) {
  // Break it up.
  var newArr =[];
  while(size<arr.length){
      newArr.push(arr.splice(0, size ));
  }
  if(arr.length<size){
      newArr.push(arr);
  }

}

演示:

function chunkArrayInGroups(arr, size) {
  // Break it up.
  var newArr =[];
  while(size<arr.length){
      newArr.push(arr.splice(0, size));
  }
  if(arr.length<size){
      newArr.push(arr);
  }
  return newArr;
}

console.log(chunkArrayInGroups([0, 1, 2, 3, 4, 5, 6, 7,8], 2));

注意:

不需要使用result数组,因为它只是newArr的一个副本,你可以直接返回newArr而无需复制它。


1
三元条件在这里并不必要,splice 只会剪切与其参数相同数量的元素,arr.length 也不必要,除非 size 是负值(在我看来,那将是更好的条件)。 - MinusFour
@MinusFour 感谢您指出这个问题,三元操作符只是为了测试而存在的,在使用 while 循环之前,我只是忘记删除它了。但是您对于 arr.length 的提醒是正确的,我已经更新了答案。 - cнŝdk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接