Wenn Sie EcmaScript Version >= 5.1 verwenden, können Sie eine funktionale Version von chunk()
mit array.reduce() die eine Komplexität von O(N) hat:
function chunk(chunkSize, array) {
return array.reduce(function(previous, current) {
var chunk;
if (previous.length === 0 ||
previous[previous.length -1].length === chunkSize) {
chunk = []; // 1
previous.push(chunk); // 2
}
else {
chunk = previous[previous.length -1]; // 3
}
chunk.push(current); // 4
return previous; // 5
}, []); // 6
}
console.log(chunk(2, ['a', 'b', 'c', 'd', 'e']));
// prints [ [ 'a', 'b' ], [ 'c', 'd' ], [ 'e' ] ]
Erläuterung der einzelnen // nbr
oben:
- Erstellen eines neuen Chunks, wenn der vorherige Wert, d. h. das zuvor zurückgegebene Array von Chunks, leer ist oder wenn der letzte vorherige Chunk
chunkSize
Artikel
- Hinzufügen des neuen Chunks zum Array der vorhandenen Chunks
- Andernfalls ist der aktuelle Chunk der letzte Chunk im Array der Chunks
- Den aktuellen Wert zum Chunk hinzufügen
- Rückgabe des geänderten Arrays von Chunks
- Initialisierung der Reduktion durch Übergabe eines leeren Arrays
Currying basierend auf chunkSize
:
var chunk3 = function(array) {
return chunk(3, array);
};
console.log(chunk3(['a', 'b', 'c', 'd', 'e']));
// prints [ [ 'a', 'b', 'c' ], [ 'd', 'e' ] ]
Sie können die chunk()
Funktion auf die globale Array
Objekt:
Object.defineProperty(Array.prototype, 'chunk', {
value: function(chunkSize) {
return this.reduce(function(previous, current) {
var chunk;
if (previous.length === 0 ||
previous[previous.length -1].length === chunkSize) {
chunk = [];
previous.push(chunk);
}
else {
chunk = previous[previous.length -1];
}
chunk.push(current);
return previous;
}, []);
}
});
console.log(['a', 'b', 'c', 'd', 'e'].chunk(4));
// prints [ [ 'a', 'b', 'c' 'd' ], [ 'e' ] ]