En el programa, busco conjuntos de productos de pedidos a través de API. La matriz contiene una lista con productos que están duplicados. Necesito eliminar los productos duplicados en la matriz y sumar sus cantidades.
Así es como se ve la matriz que obtengo:
const productsAll = [ { name: 'Product 1', ean: '1112223334445', sku: '4445', product_id: '70604566', quantity: 1, }, { name: 'Product 1', ean: '1112223334445', sku: '4445', product_id: '70604566', quantity: 3, }, { name: 'Product 2', ean: '1112223334446', sku: '4446', product_id: '60404533', quantity: 2, }, { name: 'Product 3', ean: '1112223334447', sku: '4447', product_id: '30504512', quantity: 8, }, ];Quiero que se vea así después de eliminar los duplicados y sumar las cantidades:
Se reduce el producto 1 y se suma la cantidad
[ { name: 'Product 1', ean: '1112223334445', sku: '4445', product_id: '70604566', quantity: 4, }, { name: 'Product 2', ean: '1112223334446', sku: '4446', product_id: '60404533', quantity: 2, }, { name: 'Product 3', ean: '1112223334447', sku: '4447', product_id: '30504512', quantity: 8, }, ];Puede probar el siguiente enfoque para lograr esto. Cree un objeto ( productsCheck en mi caso) y recorra la matriz productsAll . Si el nombre ya existe en el objeto, agregue la cantidad, de lo contrario, simplemente agregue el producto a su objeto (es decir productsCheck )
Código de trabajo:
const productsAll = [{ name: 'Product 1', ean: '1112223334445', sku: '4445', product_id: '70604566', quantity: 1, }, { name: 'Product 1', ean: '1112223334445', sku: '4445', product_id: '70604566', quantity: 3, }, { name: 'Product 2', ean: '1112223334446', sku: '4446', product_id: '60404533', quantity: 2, }, { name: 'Product 3', ean: '1112223334447', sku: '4447', product_id: '30504512', quantity: 8, }, ]; const productsCheck = {} productsAll.forEach(product => { if (product.name in productsCheck) { productsCheck[product.name].quantity += product.quantity } else { productsCheck[product.name] = product } }) console.log(productsCheck)Sugeriría usar Array.reduce() para crear un mapa de cantidades para cada producto, productQuantities , mientras elimina los duplicados.
Estoy usando product_id para la clave única, uno podría usar otro si corresponde.
También sumaríamos la cantidad total en este bucle.
const productsAll = [ { name: 'Product 1', ean: '1112223334445', sku: '4445', product_id: '70604566', quantity: 1, }, { name: 'Product 1', ean: '1112223334445', sku: '4445', product_id: '70604566', quantity: 3, }, { name: 'Product 2', ean: '1112223334446', sku: '4446', product_id: '60404533', quantity: 2, }, { name: 'Product 3', ean: '1112223334447', sku: '4447', product_id: '30504512', quantity: 8, }, ]; const productQuantities = productsAll.reduce((acc, el) => { const uniqueKey = el.product_id; if (!acc[uniqueKey]) { acc[uniqueKey] = { name: el.name, quantity: el.quantity }; acc.totalQuantity = (acc.totalQuantity || 0) + el.quantity; } return acc; }, {}) console.log('Product quantities:', productQuantities); console.log('Total quantity:', productQuantities.totalQuantity) .as-console-wrapper { max-height: 100% !important; }Prueba esta lógica simple
const productsAll = [{ name: 'Product 1', ean: '1112223334445', sku: '4445', product_id: '70604566', quantity: 1,}, { name: 'Product 1', ean: '1112223334445', sku: '4445', product_id: '70604566', quantity: 3, }, { name: 'Product 2', ean: '1112223334446', sku: '4446', product_id: '60404533', quantity: 2, }, { name: 'Product 3', ean: '1112223334447', sku: '4447', product_id: '30504512', quantity: 8, }, ]; const products = {}; const reducedProducts = []; productsAll.forEach((prd,idx) => { if (products[prd.product_id]) { prd.quantity += products[prd.product_id].quantity; products[prd.product_id].quantit = prd.quantity; reducedProducts[products[prd.product_id].index] = prd; } else { products[prd.product_id] = {index:idx,quantity:prd.quantity}; reducedProducts.push(prd) } }) console.log(reducedProducts)