Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

239
Vistas
Formatee JSON, ordene por grupo clave usando vanilla js

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; }, [])
about 4 years ago · Juan Pablo Isaza
2 Respuestas
Responde la pregunta

0

El siguiente fragmento de código debería funcionar.

En cuanto a la explicación:

  1. Desea obtener una lista de todos sus objetos de tipo. Puedes hacer esto usando flatMap.
  2. Obtenga todos los valores únicos para el tipo. En ES6 puede usar SET para obtener todos los valores únicos en una lista
  3. Luego puede usar el filtro para obtener todos los objetos con el mismo tipo y luego usar reducir solo en esos.

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)

about 4 years ago · Juan Pablo Isaza Denunciar

0

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}

about 4 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda