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