Simple maths. If You have n
items and want to split them into k
chunks, every chunk will have n / k
items. But what if n / k
isn't an integer? Then some of the chunks will have n / k rounded down
items and some will have n / k rounded down + 1
items. How many of them will have the + 1
items? n % k
.
function distribute(a, k) {
var count = Math.floor(a.length / k);
var remain = a.length % k;
var result = [];
var index = 0;
for (var i = 0; i < k; i++) {
var number = count + (i < remain ? 1 : 0);
result.push(a.slice(index, index + number));
index += number;
}
return result;
}
distribute([1, 2, 3, 4, 5, 6, 7], 2);
--> [[1, 2, 3, 4], [5, 6, 7]]
Edit by Nordfjord: Shorter, but groups different values than the solution above:
groupByNumberOfGroups = function(array, numberOfGroups){
var groups = []
for(var i = 0; i < numberOfGroups; ++i) groups.push([]);
for(var i = 0; i < array.length; ++i) groups[i%numberOfGroups].push(array[i]);
return groups;
}