Хорошо, давайте начнем с довольно жесткого:
function chunk(arr, n) {
return arr.slice(0,(arr.length+n-1)/n|0).
map(function(c,i) { return arr.slice(n*i,n*i+n); });
}
Который используется следующим образом:
chunk([1,2,3,4,5,6,7], 2);
Тогда у нас есть эта плотная редукционная функция:
function chunker(p, c, i) {
(p[i/this|0] = p[i/this|0] || []).push(c);
return p;
}
Используется следующим образом:
[1,2,3,4,5,6,7].reduce(chunker.bind(3),[]);
Так как котенок умирает, когда мы привязываем this
к числу, мы можем сделать ручное currying следующим образом:
// Fluent alternative API without prototype hacks.
function chunker(n) {
return function(p, c, i) {
(p[i/n|0] = p[i/n|0] || []).push(c);
return p;
};
}
Используется следующим образом:
[1,2,3,4,5,6,7].reduce(chunker(3),[]);
Затем все еще довольно тугая функция, которая делает все это за один раз:
function chunk(arr, n) {
return arr.reduce(function(p, cur, i) {
(p[i/n|0] = p[i/n|0] || []).push(cur);
return p;
},[]);
}
chunk([1,2,3,4,5,6,7], 3);