关于如何split a JavaScript array into chunks有一个很好的问题。我目前正在使用这个用于我正在编写的一些统计方法,而answer that I'm using如下所示(尽管我选择不像在答案中那样扩展Array原型):
var chunk = function(array, chunkSize) {
return [].concat.apply([],
array.map(function(elem,i) {
return i%chunkSize ? [] : [array.slice(i,i+chunkSize)];
})
);
};
这需要一个数组,例如[1,2,3,4,5,6]
,并且chunkSize
返回2 [[1,2],[3,4],[5,6]]
。我很好奇我是如何修改它来创建一个“重叠”块的数组(或者对那些熟悉移动平均线等方法的人来说,“移动子组”)。
提供与上面相同的数组和3的chunkSize
,它将返回[[1,2,3],[2,3,4],[3,4,5],[4,5,6]]
。 chunkSize
为2将返回[[1,2],[2,3],[3,4],[4,5],[5,6]]
。
有关如何处理此事的任何想法?
答案 0 :(得分:3)
function chunk (array, chunkSize) {
var retArr = [];
for (var i = 0; i < array.length - (chunkSize - 1); i++){
retArr.push(array.slice(i, i+chunkSize));
}
return retArr;
}
如果你确实想要扩展原型(可能会更好),它看起来就像这样。
Array.prototype.chunk = function( chunkSize ) {
var retArr = [];
for (var i = 0; i < this.length - (chunkSize - 1); i++){
retArr.push( this.slice(i, i+chunkSize));
}
return retArr;
}
答案 1 :(得分:0)
我对javaScript并不擅长,但这在算法上非常容易实现,有两个嵌套的for循环。这是C#的解决方案 - 您应该能够很容易地解决这个问题。
这使用的不是最优的数据结构,除了算法本身之外的一切都很明显。
protected List<List<int>> Split(List<int> array, int chunkSize)
{
List<List<int>> result = new List<List<int>>();
for (int i = 0; i < array.Count - chunkSize; i++)
{
List<int> temp = new List<int>();
for (int j = i; j < i + chunkSize; j++)
{
temp.Add(array[j]);
}
result.Add(temp);
}
return result;
}