将数组分组 - 我的代码有啥问题?
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 < 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 @,我更新了答案。以上是关于将数组分组 - 我的代码有啥问题?的主要内容,如果未能解决你的问题,请参考以下文章