5

关于如何将JavaScript 数组拆分为块有一个很好的问题。我目前正在将它用于我正在编写的一些统计方法,我正在使用的答案如下(尽管我选择不像他们在答案中那样扩展 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],并给定一个chunkSize2 个返回[[1,2],[3,4],[5,6]]。我很好奇如何修改它以创建一组“重叠”块(或者对于那些熟悉诸如移动平均线、“移动子组”等方法的人)。

提供与上面和 3 相同的数组chunkSize,它将返回[[1,2,3],[2,3,4],[3,4,5],[4,5,6]]. A chunkSizeof 2 将返回[[1,2],[2,3],[3,4],[4,5],[5,6]]

关于如何解决这个问题的任何想法?

4

3 回答 3

5
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;
}
于 2013-02-20T17:26:36.053 回答
0

使用更具声明性和简洁性(IMO)的方法。

const data = [1,2,3,4,5,6];

function getGroups(dataList, groupSize) {
  return dataList
    .slice(groupSize - 1)
    .map((_, index) => dataList.slice(index, index + groupSize));
}
console.log("2:", JSON.stringify(getGroups(data, 2)));
console.log("3:", JSON.stringify(getGroups(data, 3)));

首先,我从数组的开头删除元素的数量,因为输出中的元素数量会适当地减少。然后我遍历剩余的元素,将它们映射到适当的组。

于 2021-09-09T08:29:05.623 回答
-1

我对 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;
}
于 2013-02-20T17:39:27.583 回答