Array Utilities
A collection of functions for handling arrays with type-safety and efficiency. Includes chunking, deduplication, flattening, grouping, sorting, partitioning, and more. All methods are fully typed.
API Summary​
chunk<T>(array: T[], size: number): T[][]- splits an array into chunks of the specified size.unique<T>(array: T[], keyFn?: (item: T) => unknown): T[]- removes duplicate items from an array, optionally by a key function.flattenDeep<T>(array: any[]): T[]- deeply flattens a nested array.random<T>(array: T[]): T | undefined- returns a random element from an array.groupBy<T>(array: T[], keyOrFn: keyof T | ((item: T) => string | number | symbol)): Record<string | number | symbol, T[]>- groups array items by a key or function.shuffle<T>(array: T[]): T[]- shuffles array elements randomly.pluck<T, K extends keyof T>(array: T[], key: K): T[K][]- extracts values for a given key from an array of objects.difference<T>(a: T[], b: T[]): T[]- returns elements in arrayanot present in arrayb.intersect<T>(a: T[], b: T[]): T[]- returns elements common to both arrays.mergeSort<T>(array: T[], key: string | ((item: T) => any), direction?: "asc" | "desc"): T[]- sorts array by key or function using merge sort.zip<T>(...arrays: T[][]): T[][]- combines multiple arrays element-wise.partition<T>(array: T[], predicate: (item: T, index: number, array: T[]) => boolean): [T[], T[]]- splits array into two arrays based on a predicate function.range(start: number, end: number, step?: number): number[]- creates an array of numbers in a range.take<T>(array: T[], n?: number): T[]- takes the firstnelements from an array.takeWhile<T>(array: T[], predicate: (item: T, index: number) => boolean): T[]- takes elements from array while predicate is true.compact<T>(array: T[]): NonNullable<T>[]- removes falsy values from an array.countBy<T>(array: T[], keyFn: (item: T) => string | number | symbol): Record<string, number>- counts occurrences of items in an array by a key function.
Function Documentation & Usage Examples​
chunk()​
Splits an array into chunks of the specified size.
Method Signature:
function chunk<T>(array: T[], size: number): T[][];
Parameters:
array: The input array to be chunked.size: The size of each chunk.
Returns:
- An array of chunks, each containing up to
sizeelements.
Examples:
import { chunk } from '@catbee/utils';
chunk([1, 2, 3, 4, 5], 2); // [[1, 2], [3, 4], [5]]
unique()​
Removes duplicate items from an array, optionally by a key function.
Method Signature:
function unique<T>(array: T[], keyFn?: (item: T) => unknown): T[];
Parameters:
array: The input array to remove duplicates from.keyFn: An optional function to determine the key for each item.
Returns:
- A new array with unique items. Does not mutate the original array.
Examples:
import { unique } from '@catbee/utils';
unique([1, 2, 2, 3, 1]); // [1, 2, 3]
unique(users, user => user.id); // [{ id: 1, ... }, { id: 2, ... }]
flattenDeep()​
Deeply flattens a nested array.
Method Signature:
function flattenDeep<T>(array: any[]): T[];
Parameters:
array: The input array to deeply flatten.
Returns:
- A new flattened array of type
T[]. Does not mutate the original array.
Examples:
import { flattenDeep } from '@catbee/utils';
flattenDeep([1, [2, [3, [4]], 5]]); // [1, 2, 3, 4, 5]
random()​
Returns a random element from an array.
Method Signature:
function random<T>(array: T[]): T | undefined;
Parameters:
array: The input array to select a random element from.
Returns:
- A random element of type
Torundefinedif the array is empty.
Examples:
import { random } from '@catbee/utils';
random(['a', 'b', 'c']); // 'a' or 'b' or 'c'
groupBy()​
Groups array items by a key or function.
Method Signature:
function groupBy<T>(array: T[], key: keyof T): Record<string, T[]>;
function groupBy<T, K extends string | number | symbol>(array: T[], keyFn: (item: T) => K): Record<K, T[]>;
function groupBy<T>(array: T[], keyOrFn: keyof T | ((item: T) => string | number | symbol)): Record<string | number | symbol, T[]>;
Parameters:
array: The input array to group items from.keyOrFn: The key or function to group items by.
Returns:
- An object where keys are the group identifiers and values are arrays of grouped items.
Examples:
import { groupBy } from '@catbee/utils';
const users = [
{ name: 'Alice', role: 'admin' },
{ name: 'Bob', role: 'user' },
{ name: 'Charlie', role: 'admin' }
];
groupBy(users, 'role'); // { admin: [...], user: [...] }
groupBy(users, user => user.name[0]); // { A: [...], B: [...], ... }
shuffle()​
Shuffles array elements randomly.
Method Signature:
function shuffle<T>(array: T[]): T[];
Parameters:
array: The input array to shuffle.
Returns:
- A new shuffled array of type
T[]. Does not mutate the original array.
Examples:
import { shuffle } from '@catbee/utils';
shuffle([1, 2, 3, 4]); // [3, 1, 4, 2] (order will vary)
pluck()​
Extracts values for a given key from an array of objects.
Method Signature:
function pluck<T, K extends keyof T>(array: T[], key: K): T[K][];
Parameters:
array: The input array to pluck values from.key: The key to pluck values for.
Returns:
- An array of plucked values.
Examples:
import { pluck } from '@catbee/utils';
const users = [{ name: 'Alice' }, { name: 'Bob' }];
pluck(users, 'name'); // ['Alice', 'Bob']
difference()​
Returns elements in array a not present in array b.
Method Signature:
function difference<T>(a: T[], b: T[]): T[];
Parameters:
a: The first array to compare.b: The second array to compare.
Examples:
import { difference } from '@catbee/utils';
difference([1, 2, 3, 4], [2, 4]); // [1, 3]
intersect()​
Returns elements common to both arrays.
Method Signature:
function intersect<T>(a: T[], b: T[]): T[];
Parameters:
a: The first array to compare.b: The second array to compare.
Examples:
import { intersect } from '@catbee/utils';
intersect([1, 2, 3], [2, 3, 4]); // [2, 3]
mergeSort()​
Sorts array by key or function using merge sort.
Method Signature:
function mergeSort<T>(array: T[], key: string | ((item: T) => any), direction?: 'asc' | 'desc'): T[];
Parameters:
array: The input array to sort.key: The key or function to sort by.direction: The sort direction, either "asc" or "desc".
Returns:
- A new sorted array of type
T[]. Does not mutate the original array.
Examples:
import { mergeSort } from '@catbee/utils';
const items = [{ value: 3 }, { value: 1 }, { value: 2 }];
mergeSort(items, item => item.value); // [{ value: 1 }, { value: 2 }, { value: 3 }]
mergeSort(items, item => item.value, 'desc'); // [{ value: 3 }, { value: 2 }, { value: 1 }]
zip()​
Combines multiple arrays element-wise.
Method Signature:
function zip<T>(...arrays: T[][]): T[][];
Parameters:
arrays: The input arrays to combine.
Returns:
- A new array of type
T[][]. Does not mutate the original arrays.
Examples:
import { zip } from '@catbee/utils';
zip([1, 2], ['a', 'b'], [true, false]); // [[1, 'a', true], [2, 'b', false]]
partition()​
Splits array into two arrays based on a predicate function.
Method Signature:
function partition<T>(array: T[], predicate: (item: T, index: number, array: T[]) => boolean): [T[], T[]];
Parameters:
arrays: The input arrays to combine.predicate: A function that returns true to include the item in the first array.item: The current item being processed.index: The index of the current item.array: The original array being processed.
Returns:
- A new array of type
T[][]. Does not mutate the original arrays.
Examples:
import { partition } from '@catbee/utils';
partition([1, 2, 3, 4], n => n % 2 === 0); // [[2, 4], [1, 3]]
range()​
Creates an array of numbers in a range.
Method Signature:
function range(start: number, end: number, step?: number): number[];
Parameters:
start: The starting number of the range (inclusive).end: The ending number of the range (exclusive).step: The increment between numbers in the range (default is 1).
Returns:
- An array of numbers in the specified range.
Examples:
import { range } from '@catbee/utils';
range(0, 5); // [0, 1, 2, 3, 4]
range(2, 10, 2); // [2, 4, 6, 8]
take()​
Takes the first n elements from an array.
Method Signature:
function take<T>(array: T[], n?: number): T[];
Parameters:
array: The input array to take elements from.n: The number of elements to take (default is 1).
Returns:
- A new array containing the first
nelements. Does not mutate the original array.
Examples:
import { take } from '@catbee/utils';
take([1, 2, 3, 4], 2); // [1, 2]
takeWhile()​
Takes elements from array while predicate is true.
Method Signature:
function takeWhile<T>(array: T[], predicate: (item: T, index: number) => boolean): T[];
Parameters:
array: The input array to take elements from.predicate: A function that returns true to keep taking elements.item: The current item being processed.index: The index of the current item.
Returns:
- A new array containing the leading elements that satisfy the predicate. Does not mutate the original array
Examples:
import { takeWhile } from '@catbee/utils';
takeWhile([1, 2, 3, 2, 1], n => n < 3); // [1, 2]
compact()​
Removes falsy values from an array.
Method Signature:
function compact<T>(array: T[]): NonNullable<T>[];
Parameters:
array: The input array to compact.
Returns:
- A new array with all falsy values removed. Does not mutate the original array.
Examples:
import { compact } from '@catbee/utils';
compact([0, 1, false, 2, '', 3, null, undefined]); // [1, 2, 3]
countBy()​
Counts occurrences by key or function.
Method Signature:
function countBy<T>(array: T[], keyFn: (item: T) => string | number | symbol): Record<string, number>;
Parameters:
array: The input array to count occurrences from.keyFn: A function that returns the key to count by.
Returns:
- An object where keys are the counted identifiers and values are their counts.
Examples:
import { countBy } from '@catbee/utils';
countBy(['cat', 'dog', 'cat'], pet => pet); // { cat: 2, dog: 1 }