mirror of
https://github.com/Xahau/xahau.js.git
synced 2025-11-19 19:55:51 +00:00
@@ -14,20 +14,24 @@ type ValueOf<T> = T[keyof T]
|
|||||||
*/
|
*/
|
||||||
export function groupBy<T>(
|
export function groupBy<T>(
|
||||||
array: T[],
|
array: T[],
|
||||||
iteratee: (value: T, index: number, array: T[]) => string,
|
iteratee: (value: T, index: number, array: T[]) => string | number,
|
||||||
): { [p: string]: T[] } {
|
): Record<string | number, T[]> {
|
||||||
// eslint-disable-next-line max-params -- need all the params for the fallback
|
// eslint-disable-next-line max-params -- need all the params for the fallback
|
||||||
return array.reduce<{ [key: string]: T[] }>(function predicate(
|
function predicate(
|
||||||
acc,
|
acc: Record<string | number, T[]>,
|
||||||
value,
|
value: T,
|
||||||
index,
|
index: number,
|
||||||
arrayReference,
|
arrayReference: T[],
|
||||||
) {
|
): Record<string | number, T[]> {
|
||||||
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- being safe for js users
|
const key = iteratee(value, index, arrayReference) || 0
|
||||||
;(acc[iteratee(value, index, arrayReference)] ||= []).push(value)
|
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Find existing group or create a new one
|
||||||
|
const group = acc[key] || []
|
||||||
|
group.push(value)
|
||||||
|
acc[key] = group
|
||||||
return acc
|
return acc
|
||||||
},
|
}
|
||||||
{})
|
|
||||||
|
return array.reduce(predicate, {})
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
27
packages/xrpl/test/utils/collections.test.ts
Normal file
27
packages/xrpl/test/utils/collections.test.ts
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
import { groupBy, omitBy } from '../../src/utils/collections'
|
||||||
|
|
||||||
|
describe('Collection Utils:', () => {
|
||||||
|
// Inspired from tests at https://github.com/lodash/lodash/blob/main/test/groupBy.spec.js
|
||||||
|
describe('groupBy', () => {
|
||||||
|
const array = [6.1, 4.2, 6.3]
|
||||||
|
|
||||||
|
it('should transform keys by `iteratee`', () => {
|
||||||
|
const actual = groupBy(array, Math.floor)
|
||||||
|
expect(actual).toEqual({ 4: [4.2], 6: [6.1, 6.3] })
|
||||||
|
})
|
||||||
|
|
||||||
|
it('should transform keys by `iteratee` that returns strings', () => {
|
||||||
|
const actual = groupBy(array, (item) => Math.floor(item).toString())
|
||||||
|
expect(actual).toEqual({ '4': [4.2], '6': [6.1, 6.3] })
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
// Taken from https://github.com/lodash/lodash/blob/main/test/omitBy.spec.js
|
||||||
|
describe('omitBy', () => {
|
||||||
|
it('should work with a predicate argument', () => {
|
||||||
|
const object = { aa: 1, bb: 2, cc: 3, dd: 4 }
|
||||||
|
const actual = omitBy(object, (num) => num !== 2 && num !== 4)
|
||||||
|
expect(actual).toEqual({ bb: 2, dd: 4 })
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
||||||
Reference in New Issue
Block a user