From b3a34c5340c5ee9c94559f40cecd1f30234ddcad Mon Sep 17 00:00:00 2001 From: AhmedHdeawy Date: Thu, 5 Dec 2024 22:24:56 +0200 Subject: [PATCH 1/3] feat: added exists() function to the array helper and tested it --- packages/core/lib/utils/array.ts | 24 +++++++++++++++++++ .../core/tests/helpers/arrayHelper.spec.ts | 15 ++++++++++++ 2 files changed, 39 insertions(+) create mode 100644 packages/core/tests/helpers/arrayHelper.spec.ts diff --git a/packages/core/lib/utils/array.ts b/packages/core/lib/utils/array.ts index 77c4fac..ae19ba4 100644 --- a/packages/core/lib/utils/array.ts +++ b/packages/core/lib/utils/array.ts @@ -145,4 +145,28 @@ export class Arr { return undefined; } + + static exists(arr: T[], key: string | number): boolean { + // Check if the key is a valid index for the array + if (typeof key === 'number' && key >= 0 && key < arr.length) { + return true; + } + + // If key is not a number, convert to string for dot notation check + if (typeof key === 'string') { + // Handle dot notation + 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; + } } diff --git a/packages/core/tests/helpers/arrayHelper.spec.ts b/packages/core/tests/helpers/arrayHelper.spec.ts new file mode 100644 index 0000000..02ba0d6 --- /dev/null +++ b/packages/core/tests/helpers/arrayHelper.spec.ts @@ -0,0 +1,15 @@ +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(); + }); +}); From 9d7a08f278cd279a58fc7123b59793e53f6cbb66 Mon Sep 17 00:00:00 2001 From: AhmedHdeawy Date: Thu, 5 Dec 2024 22:35:09 +0200 Subject: [PATCH 2/3] feat: added last() function to the array helper with the test cases --- packages/core/lib/utils/array.ts | 24 ++++++++++++++++--- .../core/tests/helpers/arrayHelper.spec.ts | 23 +++++++++++++++++- 2 files changed, 43 insertions(+), 4 deletions(-) diff --git a/packages/core/lib/utils/array.ts b/packages/core/lib/utils/array.ts index ae19ba4..84c8f85 100644 --- a/packages/core/lib/utils/array.ts +++ b/packages/core/lib/utils/array.ts @@ -147,14 +147,11 @@ export class Arr { } static exists(arr: T[], key: string | number): boolean { - // Check if the key is a valid index for the array if (typeof key === 'number' && key >= 0 && key < arr.length) { return true; } - // If key is not a number, convert to string for dot notation check if (typeof key === 'string') { - // Handle dot notation const splitKeys = key.split('.'); if (!splitKeys.length) return false; @@ -169,4 +166,25 @@ export class Arr { 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 index 02ba0d6..7add485 100644 --- a/packages/core/tests/helpers/arrayHelper.spec.ts +++ b/packages/core/tests/helpers/arrayHelper.spec.ts @@ -1,7 +1,7 @@ import { Arr } from '../../lib/utils/array'; describe('Array Helper', () => { - beforeEach(async () => {}); + beforeEach(async () => { }); it('check key exists', () => { const arr = [1, 2, 3, 4, 5]; @@ -12,4 +12,25 @@ describe('Array Helper', () => { 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(); + }); }); From aa7b429bb3befad916ebb5bcee00a512f13c8bdc Mon Sep 17 00:00:00 2001 From: AhmedHdeawy Date: Fri, 10 Jan 2025 15:17:47 +0200 Subject: [PATCH 3/3] fix: fixed lintinig issues by running prettier with write flag --- packages/core/lib/utils/array.ts | 6 ++++-- packages/core/tests/helpers/arrayHelper.spec.ts | 4 ++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/packages/core/lib/utils/array.ts b/packages/core/lib/utils/array.ts index 84c8f85..4034af2 100644 --- a/packages/core/lib/utils/array.ts +++ b/packages/core/lib/utils/array.ts @@ -160,7 +160,9 @@ export class Arr { } if (Obj.isObj(arr[splitKeys[0]])) { - return Obj.get(arr[splitKeys[0]], splitKeys.slice(1).join('.')) !== undefined; + return ( + Obj.get(arr[splitKeys[0]], splitKeys.slice(1).join('.')) !== undefined + ); } } @@ -169,7 +171,7 @@ export class Arr { static last( arr: T[], - predicate?: ((item: T, index: number, array: T[]) => boolean) | null + predicate?: ((item: T, index: number, array: T[]) => boolean) | null, ): T | undefined { if (!arr || arr.length === 0) { return undefined; diff --git a/packages/core/tests/helpers/arrayHelper.spec.ts b/packages/core/tests/helpers/arrayHelper.spec.ts index 7add485..627ea30 100644 --- a/packages/core/tests/helpers/arrayHelper.spec.ts +++ b/packages/core/tests/helpers/arrayHelper.spec.ts @@ -1,7 +1,7 @@ import { Arr } from '../../lib/utils/array'; describe('Array Helper', () => { - beforeEach(async () => { }); + beforeEach(async () => {}); it('check key exists', () => { const arr = [1, 2, 3, 4, 5]; @@ -24,7 +24,7 @@ describe('Array Helper', () => { { name: 'Alice', age: 25 }, { name: 'Bob', age: 30 }, { name: 'Charlie', age: 35 }, - { name: 'David', age: 30 } + { name: 'David', age: 30 }, ]; const lastUserUnder35 = Arr.last(users, user => user.age < 35); expect(lastUserUnder35).toEqual({ name: 'David', age: 30 });