将数组拆分为重叠块(移动子组)

时间:2013-02-20 17:18:32

标签: javascript arrays splice moving-average

关于如何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]]

有关如何处理此事的任何想法?

2 个答案:

答案 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;
}