-
Notifications
You must be signed in to change notification settings - Fork 4
/
to-object-array.ts
57 lines (54 loc) 路 1.39 KB
/
to-object-array.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
import type { Dictionary } from '../type';
import { isMap } from '../is';
type ToObjectArrayOptions<T> = {
/**
* @default value
*/
keyPropName?: string;
/**
* @default label
*/
valuePropName?: string;
/**
* 閬嶅巻key value
*/
callbackfn?: (k: string, v: T[keyof T]) => T | void;
};
/**
* object to array
* @param dict {Dictionary<any>}
* @param opts {ToObjectArrayOptions}
* @default { keyPropName: 'label', valuePropName: 'value' }
* @example
* ```ts
* const a = { a: 1, b: 2 }
* toObjectArray(a) // [{ value: 'a', label: 1 }, { value: 'b', label: 2 }]
* const b = new Map([['a', 1], ['b', 2]])
* toObjectArray(a) // [{ value: 'a', label: 1 }, { value: 'b', label: 2 }]
* ```
* @category Object
*/
function toObjectArray<T extends Record<string, any> = { label: any; value: string }>(
dict: Dictionary<any>,
opts?: ToObjectArrayOptions<T>,
): Array<T> {
const { keyPropName = 'value', valuePropName = 'label' } = opts || {};
const result: T[] = [];
const fn: ToObjectArrayOptions<T>['callbackfn'] = (k, v) => {
if (opts?.callbackfn) {
return opts.callbackfn(k, v);
}
return {
[keyPropName]: k,
[valuePropName]: dict[k],
} as T;
};
for (const [k, v] of isMap(dict) ? dict : Object.entries(dict)) {
const item = fn(k, v);
if (item) {
result.push(item);
}
}
return result;
}
export default toObjectArray;