From d4b5e45bf09ac39a2e49f32784a618c5750cb535 Mon Sep 17 00:00:00 2001 From: Aybrea Date: Sun, 3 Nov 2024 14:24:43 +0800 Subject: [PATCH] feat: extend collection methods --- src/collection.ts | 76 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) diff --git a/src/collection.ts b/src/collection.ts index 4bb69ca..47de1e3 100644 --- a/src/collection.ts +++ b/src/collection.ts @@ -15,6 +15,9 @@ import { isWeakMap, } from './general' +type CollectionByKey = Record +type AnyLiteral = Record + export function mergeWith, TSource extends Record>( object: TObject, source: TSource, @@ -167,3 +170,76 @@ export function cloneDeepWith(value: T, fn: (value: any) => any): T { return baseCloneDeep(value, cache) } + +export function buildCollection( + collection: T[], + keyOrCallback: keyof T | ((member: T) => [K, R]), +): Record { + return collection.reduce( + (byKey: Record, member: T) => { + if (typeof keyOrCallback === 'function') { + const [key, value] = keyOrCallback(member) + byKey[key] = value + } else { + byKey[member[keyOrCallback] as K] = member as unknown as R + } + + return byKey + }, + {} as Record, + ) +} + +export function mapValues( + byKey: CollectionByKey, + callback: (member: M, key: string, index: number, originalByKey: CollectionByKey) => R, +): CollectionByKey { + return Object.keys(byKey).reduce((newByKey: CollectionByKey, key, index) => { + newByKey[key] = callback(byKey[key], key, index, byKey) + return newByKey + }, {}) +} + +export function pick(object: T, keys: K[]) { + return keys.reduce( + (result, key) => { + result[key] = object[key] + return result + }, + {} as Pick, + ) +} + +export function pickTruthy(object: T, keys: K[]) { + return keys.reduce( + (result, key) => { + if (object[key]) { + result[key] = object[key] + } + + return result + }, + {} as Pick, + ) +} + +export function omit(object: T, keys: K[]): Omit { + const stringKeys = new Set(keys.map(String)) + const savedKeys = Object.keys(object).filter((key) => !stringKeys.has(key)) as Array> + + return pick(object, savedKeys) +} + +export function omitUndefined(object: T): T { + return Object.keys(object).reduce((result, stringKey) => { + const key = stringKey as keyof T + if (object[key] !== undefined) { + result[key as keyof T] = object[key] + } + return result + }, {} as T) +} + +export function isLiteralObject(value: any): value is AnyLiteral { + return isObject(value) && !Array.isArray(value) +}