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