diff --git a/packages/core/lib/utils/array.ts b/packages/core/lib/utils/array.ts index 77c4fac..4034af2 100644 --- a/packages/core/lib/utils/array.ts +++ b/packages/core/lib/utils/array.ts @@ -145,4 +145,48 @@ export class Arr { return undefined; } + + static exists(arr: T[], key: string | number): boolean { + if (typeof key === 'number' && key >= 0 && key < arr.length) { + return true; + } + + if (typeof key === 'string') { + const splitKeys = key.split('.'); + if (!splitKeys.length) return false; + + if (Arr.isArray(arr[splitKeys[0]])) { + return Arr.exists(arr[splitKeys[0]], splitKeys.slice(1).join('.')); + } + + if (Obj.isObj(arr[splitKeys[0]])) { + return ( + Obj.get(arr[splitKeys[0]], splitKeys.slice(1).join('.')) !== undefined + ); + } + } + + return false; + } + + static last( + arr: T[], + predicate?: ((item: T, index: number, array: T[]) => boolean) | null, + ): T | undefined { + if (!arr || arr.length === 0) { + return undefined; + } + + if (!predicate) { + return arr[arr.length - 1]; + } + + for (let i = arr.length - 1; i >= 0; i--) { + if (predicate(arr[i], i, arr)) { + return arr[i]; + } + } + + return undefined; + } } diff --git a/packages/core/tests/helpers/arrayHelper.spec.ts b/packages/core/tests/helpers/arrayHelper.spec.ts new file mode 100644 index 0000000..627ea30 --- /dev/null +++ b/packages/core/tests/helpers/arrayHelper.spec.ts @@ -0,0 +1,36 @@ +import { Arr } from '../../lib/utils/array'; + +describe('Array Helper', () => { + beforeEach(async () => {}); + + it('check key exists', () => { + const arr = [1, 2, 3, 4, 5]; + expect(Arr.exists(arr, 2)).toBeTruthy(); + }); + + it('check key does not exist', () => { + const arr = [1, 2, 3, 4, 5]; + expect(Arr.exists(arr, 6)).toBeFalsy(); + }); + + it('should return last element matching predicate', () => { + const arr = [1, 2, 3, 4, 5]; + expect(Arr.last(arr, x => x < 4)).toBe(3); + expect(Arr.last(arr)).toBe(5); + }); + + it('should return the last object that matches the predicate', () => { + const users = [ + { name: 'Alice', age: 25 }, + { name: 'Bob', age: 30 }, + { name: 'Charlie', age: 35 }, + { name: 'David', age: 30 }, + ]; + const lastUserUnder35 = Arr.last(users, user => user.age < 35); + expect(lastUserUnder35).toEqual({ name: 'David', age: 30 }); + }); + + it('should return undefined for empty array', () => { + expect(Arr.last([])).toBeUndefined(); + }); +});