import { intersection, union } from 'lodash'; import { AggregateProductDataWithIdentifiers } from './types'; const mergeProducts = ( productA: T, productB: T ): T => { return Object.assign(productA, { ...productB, data: { ...productB.data, imageUrls: union(productA.data.imageUrls, productB.data.imageUrls), }, identifiers: union(productA.identifiers, productB.identifiers), }); }; export const mergeDuplicatesByIdentifiers = < T extends AggregateProductDataWithIdentifiers >( products: T[] ): T[] => { const uniqueProducts = new Array(); products.forEach((product) => { const matchIndex = uniqueProducts.findIndex( ({ identifiers }) => intersection(identifiers, product.identifiers).length > 0 ); if (matchIndex >= 0) { uniqueProducts[matchIndex] = mergeProducts( uniqueProducts[matchIndex], product ); } else { uniqueProducts.push(product); } }); return uniqueProducts; };