И это будет моим вкладом в эту тему. Я думаю, что .reduce()
- лучший способ.
var segment = (arr, n) => arr.reduce((r,e,i) => i%n ? (r[r.length-1].push(e), r)
: (r.push([e]), r), []),
arr = Array.from({length: 31}).map((_,i) => i+1);
res = segment(arr,7);
console.log(JSON.stringify(res));
Но вышеприведенная реализация не очень эффективна, поскольку .reduce()
проходит через все arr
. Более эффективный подход (очень близкий к самому быстрому императивному решению) будет, итерации по уменьшенному (чтобы быть разбитым) массивом, поскольку мы можем заранее вычислить его размер на Math.ceil(arr/n);
. Когда у нас есть пустой массив результатов, подобный Array(Math.ceil(arr.length/n)).fill();
, остальное состоит в отображении в него ломтиков массива arr
.
function chunk(arr,n){
var r = Array(Math.ceil(arr.length/n)).fill();
return r.map((e,i) => arr.slice(i*n, i*n+n));
}
arr = Array.from({length: 31}).map((_,i) => i+1);
res = chunk(arr,7);
console.log(JSON.stringify(res));