Yo, gente, necesito ayuda, no sé cómo manejar el objeto para obtener lo que necesito usando vainilla. Necesito agrupar por "tipo" para cada "elemento", y sumar valores de precio y descuento, y devolverlos en una matriz. Agradecería si alguien pudiera explicarme cómo abordar la transformación.
tengo este objeto
{ "w_elem": [ { "elem": [ {"type": "type_a","price": "100","discount": "10"}, {"type": "type_b","price": "120","discount": "12"}, {"type": "type_a","price": "165","discount": "10"} ], "user": "1001", "userType": "A" }, { "elem": [ {"type": "type_a","price": "50","discount": "5"}, {"type": "type_b","price": "15","discount": "0"} ], "user": "1011", "userType": "B" }, { "elem": [ {"type": "type_a","price": "20","discount": "5"}, {"type": "type_b","price": "15","discount": "0"} ], "user": "1011", "userType": "B" } ] }Debo devolver la siguiente matriz
[ {"type": "type_a","price": "335","discount":"30"}, {"type":"type_b","price": "150","discount": "12"} ]Intenté lo siguiente pero no puedo entender.
let helper = {}; const data = newArr.reduce((acc, currElem) => { currElem.elem.forEach(item => { if(!helper[currElem.type]) { helper[currElem.type] = Object.assign({}, currElem); acc.push(helper[currElem.type]) }else{ helper[currElem.type].price += currElem.price; helper[currElem.type].discount += currElem.discount; } }) return acc; }, [])El siguiente fragmento de código debería funcionar.
En cuanto a la explicación:
Nota: Dado que el conteo no existe, debe definir un valor inicial para él y, dado que define el conteo, también debe definir los otros valores en los que realiza una operación de reducción. (No hay necesidad de identificación ya que lo asigna directamente y el valor anterior no importa)
Espero que puedas seguir mi breve explicación.
const newJson = { "w_elem": [ { "elem": [ {"type": "type_a","price": "100","discount": "10"}, {"type": "type_b","price": "120","discount": "12"}, {"type": "type_a","price": "165","discount": "10"} ], "user": "1001", "userType": "A" }, { "elem": [ {"type": "type_a","price": "96.2","discount": "5"}, {"type": "type_b","price": "15","discount": "0"} ], "user": "1011", "userType": "B" }, { "elem": [ {"type": "type_a","price": "96.2","discount": "5"}, {"type": "type_b","price": "15","discount": "0"} ], "user": "1011", "userType": "B" } ] } const newArr = newJson["w_elem"] /* Get all elem */ const flatElem = newArr.flatMap((item) => { return item["elem"] }) const keys = [... new Set(flatElem.map(item => { return item["type"]}))] let data = keys.map( id => { return flatElem.filter( obj => obj["type"] === id ) .reduce((acc, cur) => ( { type: id, count: acc.count + 1, price: acc.price + parseFloat(cur.price), discount: acc.discount + parseFloat(cur.discount) } ), {count: 0, price: 0, discount: 0}) }) console.log(data)Puede simplificar la tarea haciendo una matriz plana de elementos. Y luego agrupe los valores de resumen por type .
const data = {"w_elem":[{"elem":[{"type":"type_a","price":"100","discount":"10"},{"type":"type_b","price":"120","discount":"12"},{"type":"type_a","price":"165","discount":"10"}],"user":"1001","userType":"A"},{"elem":[{"type":"type_a","price":"96.2","discount":"5"},{"type":"type_b","price":"15","discount":"0"}],"user":"1011","userType":"B"},{"elem":[{"type":"type_a","price":"96.2","discount":"5"},{"type":"type_b","price":"15","discount":"0"}],"user":"1011","userType":"B"}]}; const elems = data.w_elem.flatMap(({ elem }) => elem); const result = Object.values(elems.reduce((acc, { type, price, discount }) => { acc[type] ??= { type, count: 0, price: 0, discount: 0 }; acc[type].count += 1; acc[type].price += Number(price); acc[type].discount += Number(discount); return acc; }, {})); console.log(result); .as-console-wrapper{min-height: 100%!important; top: 0}