diff --git a/src/arrays/chunked.test.ts b/src/arrays/chunked.test.ts new file mode 100644 index 0000000..a45ba1d --- /dev/null +++ b/src/arrays/chunked.test.ts @@ -0,0 +1,44 @@ +import chunked from './chunked'; + +describe('chunked', () => { + it.each([ + { input: [1], size: 0 }, + { input: [1, 2], size: 3 }, + ])('chunks default', ({ input, size }) => { + const result = chunked(input, size); + + expect(result).toEqual([input]); + }); + + it.each([{ size: 0 }, { size: -1 }])('chunks empty input', ({ size }) => { + const result = chunked([], size); + + expect(result).toEqual([]); + }); + + it.each([{ size: -3 }, { size: 0 }])( + 'chunks zero or bellow size', + ({ size }) => { + const input = [1, 2, 3, 4]; + + const result = chunked(input, size); + + expect(result).toEqual([input]); + } + ); + + it('chunks in to equal pieces', () => { + const result = chunked([1, 2, 3, 4], 2); + + expect(result).toEqual([ + [1, 2], + [3, 4], + ]); + }); + + it('chunks in to uneven pieces', () => { + const result = chunked([1, 2, 3, 4], 3); + + expect(result).toEqual([[1, 2, 3], [4]]); + }); +}); diff --git a/src/arrays/chunked.ts b/src/arrays/chunked.ts new file mode 100644 index 0000000..a9da5e8 --- /dev/null +++ b/src/arrays/chunked.ts @@ -0,0 +1,22 @@ +export function chunked( + array: Element[], + chunkSize: number +): Element[][] { + let buffer: Element[] = []; + const chunks: Element[][] = []; + array.forEach((item, index) => { + buffer.push(item); + if (index % chunkSize !== chunkSize - 1) return; + + chunks.push(buffer); + buffer = []; + }); + + if (buffer.length > 0) { + chunks.push(buffer); + } + + return chunks; +} + +export default chunked; diff --git a/src/arrays/index.ts b/src/arrays/index.ts index 731e448..e7d7120 100644 --- a/src/arrays/index.ts +++ b/src/arrays/index.ts @@ -1,3 +1,4 @@ export * from './compactMap'; export * from './uniques'; export * from './zip'; +export * from './chunked';