mirror of
https://github.com/ArthurDanjou/ui.git
synced 2026-01-18 05:58:07 +01:00
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: Daniel Roe <daniel@roe.dev> Co-authored-by: Benjamin Canac <canacb1@gmail.com>
84 lines
2.1 KiB
TypeScript
84 lines
2.1 KiB
TypeScript
import { isEqual } from 'ohash/utils'
|
|
|
|
export function pick<Data extends object, Keys extends keyof Data>(data: Data, keys: Keys[]): Pick<Data, Keys> {
|
|
const result = {} as Pick<Data, Keys>
|
|
|
|
for (const key of keys) {
|
|
result[key] = data[key]
|
|
}
|
|
|
|
return result
|
|
}
|
|
|
|
export function omit<Data extends object, Keys extends keyof Data>(data: Data, keys: Keys[]): Omit<Data, Keys> {
|
|
const result = { ...data }
|
|
|
|
for (const key of keys) {
|
|
// eslint-disable-next-line @typescript-eslint/no-dynamic-delete
|
|
delete result[key]
|
|
}
|
|
|
|
return result as Omit<Data, Keys>
|
|
}
|
|
|
|
export function get(object: Record<string, any> | undefined, path: (string | number)[] | string, defaultValue?: any): any {
|
|
if (typeof path === 'string') {
|
|
path = path.split('.').map((key) => {
|
|
const numKey = Number(key)
|
|
return Number.isNaN(numKey) ? key : numKey
|
|
})
|
|
}
|
|
|
|
let result: any = object
|
|
|
|
for (const key of path) {
|
|
if (result === undefined || result === null) {
|
|
return defaultValue
|
|
}
|
|
|
|
result = result[key]
|
|
}
|
|
|
|
return result !== undefined ? result : defaultValue
|
|
}
|
|
|
|
export function set(object: Record<string, any>, path: (string | number)[] | string, value: any): void {
|
|
if (typeof path === 'string') {
|
|
path = path.split('.').map((key) => {
|
|
const numKey = Number(key)
|
|
return Number.isNaN(numKey) ? key : numKey
|
|
})
|
|
}
|
|
|
|
path.reduce((acc, key, i) => {
|
|
if (acc[key] === undefined) acc[key] = {}
|
|
if (i === path.length - 1) acc[key] = value
|
|
return acc[key]
|
|
}, object)
|
|
}
|
|
|
|
export function looseToNumber(val: any): any {
|
|
const n = Number.parseFloat(val)
|
|
return Number.isNaN(n) ? val : n
|
|
}
|
|
|
|
export function compare<T>(value?: T, currentValue?: T, comparator?: string | ((a: T, b: T) => boolean)) {
|
|
if (value === undefined || currentValue === undefined) {
|
|
return false
|
|
}
|
|
|
|
if (typeof value === 'string') {
|
|
return value === currentValue
|
|
}
|
|
|
|
if (typeof comparator === 'function') {
|
|
return comparator(value, currentValue)
|
|
}
|
|
|
|
if (typeof comparator === 'string') {
|
|
return get(value!, comparator) === get(currentValue!, comparator)
|
|
}
|
|
|
|
return isEqual(value, currentValue)
|
|
}
|