diff --git a/packages/core/getFieldWithDefault/index.md b/packages/core/getFieldWithDefault/index.md new file mode 100644 index 0000000..9a3d1bd --- /dev/null +++ b/packages/core/getFieldWithDefault/index.md @@ -0,0 +1,16 @@ +--- +category: '@Core' +--- + +# getField + +Get object field with multiple default fields. + +## Usage + +```ts +import { getFieldWithDefault } from '@use-kit/functions' + +const obj = { name: 'asuka', age: 23, height: 158 } +const ret = getFieldWithDefault(obj, 'default', obj.id, obj.name, obj.nickname) // 'asuak' +``` diff --git a/packages/core/getFieldWithDefault/index.test.ts b/packages/core/getFieldWithDefault/index.test.ts new file mode 100644 index 0000000..dd6acc1 --- /dev/null +++ b/packages/core/getFieldWithDefault/index.test.ts @@ -0,0 +1,15 @@ +import { describe, expect, it } from 'vitest' +import { getFieldWithDefault } from '.' + +describe('getFieldWithDefault', () => { + it('default', () => { + const obj = { name: 'asuka', age: 23, height: 158 } + expect(getFieldWithDefault( + obj, + 'defaultValue', + (obj as any)?.id, + obj?.name, + (obj as any)?.nickname, + )).toMatchInlineSnapshot('"defaultValue"') + }) +}) diff --git a/packages/core/getFieldWithDefault/index.ts b/packages/core/getFieldWithDefault/index.ts new file mode 100644 index 0000000..b2540c1 --- /dev/null +++ b/packages/core/getFieldWithDefault/index.ts @@ -0,0 +1,20 @@ +interface ObjectWithFields { [key: string]: any } + +// TODO: get field with multiple default fields +export function getFieldWithDefault( + obj: ObjectWithFields, + defaultValue: T, + ...fields: string[] +): T { + if (typeof obj !== 'object' || obj === null) + return defaultValue + + console.log('fields', fields) + for (const field of fields) { + if (Reflect.has(obj, field)) + return field as T + } + console.log('default') + + return defaultValue +} diff --git a/packages/core/getKeys/index.md b/packages/core/getKeys/index.md new file mode 100644 index 0000000..6eba659 --- /dev/null +++ b/packages/core/getKeys/index.md @@ -0,0 +1,20 @@ +--- +category: '@Core' +--- + +# getKeys + +Get keys. + +## Usage + +```ts{6,7} +import { getKeys } from '@use-kit/functions' + +const p = { name: 'asuka', age: 24 } +const ret = getKeys(p) +// [ +// "name", +// "age", +// ] +``` diff --git a/packages/core/getKeys/index.test.ts b/packages/core/getKeys/index.test.ts new file mode 100644 index 0000000..d2e9c3f --- /dev/null +++ b/packages/core/getKeys/index.test.ts @@ -0,0 +1,25 @@ +import { describe, expect, it } from 'vitest' +import { getKeys } from '.' + +describe('getKeys', () => { + it('get keys', () => expect(getKeys({ name: 'asuka', age: 24 })).toMatchInlineSnapshot(` + [ + "name", + "age", + ] + `)) + + const map = new Map([ + ['akashi', { id: 'akashi' }], + ['asuka', { id: 'asuka' }], + ]) + + it('get map keys', () => { + expect(getKeys(map)).toMatchInlineSnapshot(` + [ + "akashi", + "asuka", + ] + `) + }) +}) diff --git a/packages/core/getKeys/index.ts b/packages/core/getKeys/index.ts new file mode 100644 index 0000000..2758204 --- /dev/null +++ b/packages/core/getKeys/index.ts @@ -0,0 +1,14 @@ +import { isEmpty, isMap } from '..' + +export const getKeys = ( + obj: object | Map | null | undefined, +): string[] => { + if (isEmpty(obj)) + return [] + + if (isMap(obj)) + return Array.from((obj as Map).keys()) + + else + return Object.keys(obj as object) +} diff --git a/packages/core/getValues/index.md b/packages/core/getValues/index.md index f3b1724..df76ac4 100644 --- a/packages/core/getValues/index.md +++ b/packages/core/getValues/index.md @@ -8,6 +8,13 @@ Get values. ## Usage -```ts +```ts{6,7} import { getValues } from '@use-kit/functions' + +const p = { name: 'asuka', age: 24 } +const ret = getValues(p) +// [ +// "asuka", +// 24, +// ] ``` diff --git a/packages/core/getValues/index.test.ts b/packages/core/getValues/index.test.ts index dca5ec7..f09e837 100644 --- a/packages/core/getValues/index.test.ts +++ b/packages/core/getValues/index.test.ts @@ -1,5 +1,42 @@ import { describe, expect, it } from 'vitest' +import { getValues } from '.' describe('getField', () => { - it('get values', () => expect(true).toBeTruthy()) + it('get values', () => expect(getValues({ name: 'asuka', age: 24 })).toMatchInlineSnapshot(` + [ + "asuka", + 24, + ] + `)) + + it('get string values', () => { + expect(getValues('akashi')).toMatchInlineSnapshot(` + [ + "a", + "k", + "a", + "s", + "h", + "i", + ] + `) + }) + + const map = new Map([ + ['akashi', { id: 'akashi' }], + ['asuka', { id: 'asuka' }], + ]) + + it('get map values', () => { + expect(getValues(map as any)).toMatchInlineSnapshot(` + [ + { + "id": "akashi", + }, + { + "id": "asuka", + }, + ] + `) + }) }) diff --git a/packages/core/getValues/index.ts b/packages/core/getValues/index.ts index 27b3113..7955939 100644 --- a/packages/core/getValues/index.ts +++ b/packages/core/getValues/index.ts @@ -1,6 +1,19 @@ -export const getValues = (object: { [key: string]: T } | null | undefined): T[] => { - if (object == null) +import { isEmpty, isMap } from '..' + +interface GenericObject { + [key: string]: T +} + +export const getValues = (object: { + [key: string]: T +} | Map | string | null | undefined): T[] => { + if (isEmpty(object)) return [] - return Object.keys(object).map(key => object[key]) + if (isMap(object)) + return Array.from((object as Map).values()) + + return Object + .keys((object as GenericObject)) + .map(key => (object as GenericObject)[key]) } diff --git a/packages/core/index.ts b/packages/core/index.ts index dfc0ef9..6998809 100644 --- a/packages/core/index.ts +++ b/packages/core/index.ts @@ -13,8 +13,10 @@ export * from './getAge' export * from './getConstellation' export * from './getField' export * from './getFileType' +export * from './getKeys' export * from './getObjectField' export * from './getTreeNode' +export * from './getValues' export * from './hasField' export * from './hideMobile' diff --git a/packages/core/withDefaultObject/index.test.ts b/packages/core/withDefaultObject/index.test.ts index f1d8253..367dcab 100644 --- a/packages/core/withDefaultObject/index.test.ts +++ b/packages/core/withDefaultObject/index.test.ts @@ -60,9 +60,15 @@ describe('default object', () => { it('with default undefined', () => { const target = undefined const source = { x: 0, y: 0 } - withDefaultObject(target, source) + const ret = withDefaultObject(target, source) - // TODO: + // undefined can't set to object, use return value expect(target).toMatchInlineSnapshot('undefined') + expect(ret).toMatchInlineSnapshot(` + { + "x": 0, + "y": 0, + } + `) }) }) diff --git a/packages/docs/core/getFieldWithDefault/index.md b/packages/docs/core/getFieldWithDefault/index.md new file mode 100644 index 0000000..9a3d1bd --- /dev/null +++ b/packages/docs/core/getFieldWithDefault/index.md @@ -0,0 +1,16 @@ +--- +category: '@Core' +--- + +# getField + +Get object field with multiple default fields. + +## Usage + +```ts +import { getFieldWithDefault } from '@use-kit/functions' + +const obj = { name: 'asuka', age: 23, height: 158 } +const ret = getFieldWithDefault(obj, 'default', obj.id, obj.name, obj.nickname) // 'asuak' +``` diff --git a/packages/docs/core/getKeys/index.md b/packages/docs/core/getKeys/index.md new file mode 100644 index 0000000..6eba659 --- /dev/null +++ b/packages/docs/core/getKeys/index.md @@ -0,0 +1,20 @@ +--- +category: '@Core' +--- + +# getKeys + +Get keys. + +## Usage + +```ts{6,7} +import { getKeys } from '@use-kit/functions' + +const p = { name: 'asuka', age: 24 } +const ret = getKeys(p) +// [ +// "name", +// "age", +// ] +``` diff --git a/packages/docs/core/getValues/index.md b/packages/docs/core/getValues/index.md index f3b1724..df76ac4 100644 --- a/packages/docs/core/getValues/index.md +++ b/packages/docs/core/getValues/index.md @@ -8,6 +8,13 @@ Get values. ## Usage -```ts +```ts{6,7} import { getValues } from '@use-kit/functions' + +const p = { name: 'asuka', age: 24 } +const ret = getValues(p) +// [ +// "asuka", +// 24, +// ] ```