import { intersection, union } from 'lodash'; import { RetailerProductVariantDataWithIdentifiers } from './types'; const mergeRetailerProductVariants = ( productA: RetailerProductVariantDataWithIdentifiers, productB: RetailerProductVariantDataWithIdentifiers ): RetailerProductVariantDataWithIdentifiers => { 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 mergeDuplicatesByVariantAndProductIds = ( retailerProductVariants: RetailerProductVariantDataWithIdentifiers[] ): RetailerProductVariantDataWithIdentifiers[] => { const uniqueProducts = new Array(); retailerProductVariants.forEach((product) => { const matchIndex = uniqueProducts.findIndex( ({ retailer, productIdentifiers, variantIdentifiers }) => retailer === product.retailer && intersection(productIdentifiers, product.productIdentifiers).length > 0 && intersection(variantIdentifiers, product.variantIdentifiers).length > 0 ); if (matchIndex >= 0) { uniqueProducts[matchIndex] = mergeRetailerProductVariants( uniqueProducts[matchIndex], product ); } else { uniqueProducts.push(product); } }); return uniqueProducts; };