2013-02-20 6 views
3

Существует большой вопрос о том, как split a JavaScript array into chunks. В настоящее время я использую это для некоторых статистических методов, я пишу и answer that I'm using выглядит следующим образом (хотя я выбрал не продлить прототип массива, как они это делали в ответ):Разделение массива на перекрывающиеся куски (движущиеся подгруппы)

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]]. Мне любопытно, как я могу изменить это, чтобы создать массив «перекрывающихся» кусков (или для тех, кто знаком с такими методами, как скользящее среднее, «движущиеся подгруппы»).

При условии того же массива, что и выше, и chunkSize из 3, он будет возвращать [[1,2,3],[2,3,4],[3,4,5],[4,5,6]]. A chunkSize из 2 вернется [[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

+0

вы правы на обеих учетных записях ... Извините, я не потратил очень долгое доказательство, читая мою работу – gbtimmon

+0

на самом деле на второй мысли 'array.length - chunkSize/2' wont work. Я думаю, вам нужно 'array.length - (chunkSize - 1)' – gbtimmon

0

Я не очень хорошо разбираюсь в javaScript, но это алгоритмически очень легко достичь с помощью двух вложенных циклов. Вот решение на 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; 
}