Und das wäre mein Beitrag zu diesem Thema. Ich denke .reduce()
ist der beste Weg.
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));
Die obige Implementierung ist jedoch nicht sehr effizient, da .reduce()
läuft durch alle arr
Funktion. Ein effizienterer Ansatz (sehr nahe an der schnellsten imperativen Lösung) wäre, über das reduzierte (zu chunkende) Array zu iterieren, da wir seine Größe im Voraus berechnen können durch Math.ceil(arr/n);
. Sobald wir das leere Ergebnis-Array haben, wie Array(Math.ceil(arr.length/n)).fill();
der Rest ist die Abbildung von Abschnitten des arr
Array hinein.
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},(_,i) => i+1);
res = chunk(arr,7);
console.log(JSON.stringify(res));
So weit so gut, aber wir können den obigen Ausschnitt noch weiter vereinfachen.
var chunk = (a,n) => Array.from({length: Math.ceil(a.length/n)}, (_,i) => a.slice(i*n, i*n+n)),
arr = Array.from({length: 31},(_,i) => i+1),
res = chunk(arr,7);
console.log(JSON.stringify(res));