2013-02-20 24 views
3

關於如何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]]。 A的chunkSize將返回[[1,2],[2,3],[3,4],[4,5],[5,6]]

有關如何解決這個問題的任何想法?

回答

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; 
} 
+0

有幾件事情:首先,您需要定義'var array = this;'以便在原型擴展的for循環中使用它。其次,這非常接近,但並不完全。給定'[1,2,3,4,5,6]',它返回'[[1,2],[2,3],[3,4],[4,5]]''。將'i'的最大值從'array.length - chunkSize'更改爲'array.length - chunkSize/2'雖然解決了這個問題。感謝你! – mbeasley 2013-02-20 19:31:28

+0

你對兩個賬戶都是正確的......對不起,我沒有花很長時間證明我的工作 – gbtimmon 2013-02-20 19:35:29

+0

實際上第二個想法'array.length - chunkSize/2'不會工作。我想你會想'array.length - (chunkSize - 1)' – gbtimmon 2013-02-20 19:36:53

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