Tengo productId, que es una matriz de valores.
const groupByvalue= [1, 2];Tengo productos que tienen varias matrices de productos.
const products = [ { id: 1, name: 'milk', qty: 2 }, { id: 2, name: 'butter', qty: 2 }, { id: 3, name: 'milk', qty: 2 }, { id: 2, name: 'butter', qty: 2 }, { id: 1, name: 'milk', qty: 2 }, { id: 3, name: 'butter', qty: 2 }, { id: 1, name: 'milk', qty: 2 }, { id: 3, name: 'butter', qty: 2 } ]; const groupByKey = 'id';Necesito agrupar los productos según la identificación del producto.
conditions i) groupBy debe basarse en groupByvalue con la matriz groupBykey (solo groupBy 1, 2) ii) después del grupo, debe sumar toda la cantidad
esperado
[ { id: 1, name : "milk", qty : sum of all qty }, { id: 2, name : "butter", qty : sum of all qty } ];¡¡Gracias!!
Usando Lodash
var _ = require('lodash'); var groupByValue = [1, 2]; var groupByKey = 'id'; const products = [ { id: 1, name: 'milk', qty: 2 }, { id: 2, name: 'butter', qty: 2 }, { id: 3, name: 'milk', qty: 2 }, { id: 2, name: 'butter', qty: 2 }, { id: 1, name: 'milk', qty: 2 }, { id: 3, name: 'butter', qty: 2 }, { id: 1, name: 'milk', qty: 2 }, { id: 3, name: 'butter', qty: 2 } ] const ans = _(products) .groupBy(groupByKey) .map((product) => { if(groupByValue.includes(product[0].id)){ return { id: product[0].id, name: product[0].name, qty: _.sumBy(product, 'qty') } } }) .value() console.log(ans.filter(item => item));Producción :-
[ { id: 1, name: 'milk', qty: 6 }, { id: 2, name: 'butter', qty: 4 } ]No hay necesidad de lodash en absoluto, esta es una tarea .reduce() nativa. Puede hacer como;
var groupByValue = [1, 2], groupByKey = 'id', products = [ { id : 1 , name: 'milk' , qty : 2 } , { id : 2 , name: 'butter' , qty : 2 } , { id : 3 , name: 'milk' , qty: 2 } , { id : 2 , name: 'butter' , qty : 2 } , { id : 1 , name: 'milk' , qty : 2 } , { id : 3 , name: 'butter' , qty : 2 } , { id : 1 , name: 'milk' , qty : 2 } , { id : 3 , name: 'butter' , qty : 2 } ], interim = products.reduce( (r,p) => ( groupByValue.includes(p[groupByKey]) && (r[p[groupByKey]] ? r[p[groupByKey]].qty += p.qty : r[p[groupByKey]] = Object.assign({},p)) , r ) , {} ), result = Object.values(interim); console.log(result); Los productos milk con id:3 no cuentan.
Primero filtraría la matriz y luego haría el mapa, esto se puede hacer en una sola .reduce(...) , pero es más legible usando lodash:
const _ = require('lodash'); const groupByValue = [1, 2]; const groupByKey = 'id'; const products = [ { id: 1, name: 'milk', qty: 1 }, { id: 2, name: 'butter', qty: 2 }, { id: 3, name: 'cheese', qty: 4 }, { id: 2, name: 'butter', qty: 5 }, { id: 1, name: 'milk', qty: 3 }, { id: 3, name: 'cheese', qty: 6 }, { id: 1, name: 'milk', qty: 1 }, { id: 3, name: 'cheese', qty: 7 } ]; const result = _(products) .filter(itm => groupByValue.includes(itm.id)) .groupBy(groupByKey) .map(arr => { const { id, name } = arr[0]; return { id, name, qty: _(arr).sumBy('qty') }; }) .value(); console.log(result); // output: [{ id: 1, name: 'milk', qty: 5},{id: 2, name: 'butter', qty: 7}]