将数组分组 - 我的代码有啥问题?

Posted

技术标签:

【中文标题】将数组分组 - 我的代码有啥问题?【英文标题】: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:我特别想找出这段代码有什么问题,而不是完全不同的代码/方法。

【问题讨论】:

有什么问题? 您的实际输出和预期输出是相同的。错字? 【参考方案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 @,我更新了答案。

以上是关于将数组分组 - 我的代码有啥问题?的主要内容,如果未能解决你的问题,请参考以下文章

使用淘汰赛 Js 将嵌套数组渲染为 HTML 时,我的逻辑有啥问题?

我不明白我的数组有啥问题

我的 mysqli 代码有啥问题?

我的 Fortran 动态分配代码有啥问题?

有啥办法可以将三个班级分组吗?

信息未插入数据库(我的代码有啥问题?)