1
0
mirror of https://github.com/dzeiocom/libs.git synced 2025-06-06 08:19:53 +00:00

Updated objectSort to support an Array containing a specific order

Signed-off-by: Avior <florian.bouillon@delta-wings.net>
This commit is contained in:
Florian Bouillon 2021-04-11 00:34:14 +02:00
parent 485e3b7b36
commit 76e2263812
Signed by: Florian Bouillon
GPG Key ID: 50BD648F12C86AB6
3 changed files with 29 additions and 5 deletions

View File

@ -53,6 +53,10 @@ objectSize(object)
// like Array.sort it sort and return an ordered object
objectSort(object, /*optionnal*/ (key1, key2) => key1 - key2)
// You can also sort by keys
// items not set in the array won't have their order changed and will be after the sorted ones
objectSort(object, ['key2', 'key1']) // => {key2: value, key1: value, key3: value}
// deeply clone an object
cloneObject(object)

View File

@ -52,7 +52,7 @@ describe('Object Keys Tests', () => {
})
})
describe('Object Sort Tests', () => {
describe('Object Size Tests', () => {
it('shoud return length of the object', () => {
const obj = {
index0: true,
@ -82,6 +82,20 @@ describe('Object sort Tests', () => {
b: 'first'
})
})
it('should sort by the specified key', () => {
const obj = {
b: 'first',
a: 'second',
c: 'zero',
d: 'fourth'
}
expect(objectSort(obj, ['c', 'a'])).toEqual({
c: 'zero',
a: 'second',
b: 'first',
d: 'fourth'
})
})
})
describe('Object Clone Tests', () => {

View File

@ -62,12 +62,18 @@ export function objectSize(obj: Record<string, any>): number {
* @param obj the object to sort
* @param fn (Optionnal) the function to run to sort
*/
export function objectSort<T = Record<string, any>>(
obj: Record<string, any>,
fn?: (a: string, b: string) => number
export function objectSort<T extends Record<string, any> = Record<string, any>>(
obj: T,
fn?: Array<keyof T> | ((a: keyof T, b: keyof T) => number)
): T {
const ordered: any = {}
for (const key of objectKeys(obj).sort(fn)) {
let sortedKeys: Array<keyof T> = []
if (Array.isArray(fn)) {
sortedKeys = fn.concat(objectKeys(obj).filter((k) => !fn.includes(k)))
} else {
sortedKeys = objectKeys(obj).sort(fn)
}
for (const key of sortedKeys) {
ordered[key] = obj[key]
}
return ordered