【问题标题】:Chunk Array into groups - what's wrong with my code?将数组分组 - 我的代码有什么问题?
【发布时间】:2018-03-23 04:57:52
【问题描述】:

下面是代码:

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),我的代码将按预期返回。

P.S:我特别想找出这段代码有什么问题,而不是完全不同的代码/方法。

【问题讨论】:

  • 有什么问题?
  • 您的实际输出和预期输出是相同的。错字?

标签: javascript arrays algorithm loops logic


【解决方案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; }

【讨论】:

    【解决方案2】:

    您只需执行以下操作:

    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]]
    

    【讨论】:

      【解决方案3】:

      您的问题是您没有处理数组中剩余的项小于给定size 的情况,即arr.length &lt; 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 而无需复制它。

      【讨论】:

      • 那里不需要三元条件,拼接只会切割尽可能多的元素,arr.length 也不是必需的,除非大小为负值(这将是更好的条件 IMO )
      • @MinusFour 谢谢你指出,三元运算,在使用while循环之前是出于测试原因,我只是忘记删除它,但你是正确的@987654330 @,我更新了答案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-11
      • 1970-01-01
      • 2011-07-28
      相关资源
      最近更新 更多