From 79ad2b356a674e093a22896767fde970e2213429 Mon Sep 17 00:00:00 2001 From: Adam Laycock Date: Wed, 22 Mar 2023 08:27:45 +0000 Subject: [PATCH] feat: add keyValue function --- src/functions/keys.spec.ts | 17 ++++++++++++++++- src/functions/keys.ts | 15 +++++++++++++++ src/index.ts | 2 +- 3 files changed, 32 insertions(+), 2 deletions(-) diff --git a/src/functions/keys.spec.ts b/src/functions/keys.spec.ts index c9b0400..b8f7010 100644 --- a/src/functions/keys.spec.ts +++ b/src/functions/keys.spec.ts @@ -1,4 +1,4 @@ -import {keys} from '../' +import {keys, keyValue} from '../' describe('Keys', () => { it('should return an array of keys', () => { @@ -12,4 +12,19 @@ describe('Keys', () => { expect(k).toHaveLength(3) }) + + it('should return keys and values', () => { + const sample = { + a: 1, + b: 'two', + c: true + } + + const kv = keyValue(sample) + + expect(kv).toHaveLength(3) + + expect(kv[0].key).toBe('a') + expect(kv[0].value).toBe(1) + }) }) diff --git a/src/functions/keys.ts b/src/functions/keys.ts index 7390e52..0b0e5c4 100644 --- a/src/functions/keys.ts +++ b/src/functions/keys.ts @@ -9,3 +9,18 @@ export const keys = (object: T): (keyof T)[] => { //eslint-disable-next-line return objectKeys.filter(key => object.hasOwnProperty(key)) as any } + +type KeyValueArray< + Object extends {}, + Key extends keyof Object = keyof Object +> = {key: Key; value: Object[Key]}[] + +export const keyValue = ( + object: Object +): KeyValueArray => { + const objectKeys = keys(object) + + return objectKeys.map(key => { + return {key, value: object[key]} + }) +} diff --git a/src/index.ts b/src/index.ts index df00bb6..3659cd1 100644 --- a/src/index.ts +++ b/src/index.ts @@ -49,7 +49,7 @@ export { export {indexedBy, IndexedArray, IndexedByOptions} from './functions/indexed-by' export {invariant, InvariantOptions} from './functions/invariant' export {isEnv, isProduction, isDev, isTest} from './functions/is-env' -export {keys} from './functions/keys' +export {keys, keyValue} from './functions/keys' export {parseCDIR, CIDRObject} from './functions/network' export {mapProperty} from './functions/map-property' export {rangeAsString, rangeAsArray} from './functions/range-as-string'