TypeScript utility method I generated cases and tests for -------
static merge<T extends { id?: string }>(arr1: T[], arr2: T[]): T[] {
arr1 = arr1 || [];
arr2 = arr2 || [];
// Create a map for quick access to items in arr1 by id
const map = new Map<string, T>(arr1.map((item) => [item.id, item]));
// Iterate over arr2 and merge or add items
arr2.forEach((item) => {
if (map.has(item.id)) {
// If item exists in arr1, merge it
map.set(item.id, { ...map.get(item.id), ...item });
} else {
// If item doesn't exist in arr1, add it
map.set(item.id, item);
}
});
// Convert the map back to an array
return Array.from(map.values());
}
Generated test cases
-------------
POSITIVE - Merging two arrays with unique and overlapping objects by id
Given: Two arrays of objects with unique and overlapping ids
When: Merging two arrays of objects where some objects have matching ids
Then: Should return an array of merged objects with no duplicates and combined properties for overlapping idsNEGATIVE - Merging arrays when second array contains objects with undefined ids Given: First array of objects with valid ids and second array with some objects having undefined ids When: Second array contains objects with undefined ids Then: Should throw an error or handle undefined ids gracefully without merging those objects
EDGE CASE - Merging arrays where all objects in the second array have matching ids in the first array Given: Two arrays of objects with ids where the second array's objects all have ids that match those in the first array When: Every object in the second array has a matching id in the first array Then: Should return an array with objects from the first array having their properties updated by the second array's objects
Generated unit tests by test cases -------------
---> 1st case ---------------
it('Merging two arrays with unique and overlapping objects by id should return an array of merged objects with no duplicates and combined properties for overlapping ids', () => { // Arrange const arr1 = [{ id: '1', name: 'Alice' }, { id: '2', name: 'Bob' }]; const arr2 = [{ id: '2', name: 'Robert' }, { id: '3', name: 'Charlie' }]; const expectedResult = [ { id: '1', name: 'Alice' }, { id: '2', name: 'Robert' }, // Note: 'Bob' is overwritten by 'Robert' { id: '3', name: 'Charlie' } ];
// Act
const result = merge(arr1, arr2);
// Assert
expect(result).toEqual(expectedResult);
});---> 2nd case ----------------
it('Merging arrays when second array contains objects with undefined ids should throw an error or handle undefined ids gracefully', () => { // Arrange const arr1 = [{ id: '1', name: 'Alice' }, { id: '2', name: 'Bob' }]; const arr2 = [{ id: '2', age: 30 }, { name: 'Charlie' }]; // Charlie has undefined id
// Act and Assert
expect(() => MyArrayUtils.merge(arr1, arr2)).toThrow();
});---> 3rd case ----------------
it('Merging arrays where all objects in the second array have matching ids in the first array', () => { // Arrange const arr1 = [{ id: '1', propA: 'A1' }, { id: '2', propA: 'A2' }]; const arr2 = [{ id: '1', propB: 'B1' }, { id: '2', propB: 'B2' }]; const expectedResult = [ { id: '1', propA: 'A1', propB: 'B1' }, { id: '2', propA: 'A2', propB: 'B2' } ];
// Act
const result = merge(arr1, arr2);
// Assert
expect(result).toEqual(expectedResult);
});