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

76
Vistas
Agrupe varios campos en datos JSON

Estoy tratando de transformar un archivo JSON que proviene de una API con una estructura similar a esta:

 { "fruitType": {"name": "bananas"}, "plantedIn": {"country": "USA", "state": "Minnesota"}, "harvestMethod": {"name": "manual"}, "product": {"id": "841023781723"}, }, ... (other fruits, or the same fruit planted/harvested differently)

En algo como esto:

 "bananas": { "USA": { "manual": { "841023781723": { "fruitType": {"name": "bananas"}, "plantedIn": {"country": "USA", "state": "Minnesota"}, "harvestMethod": {"name": "manual"}, "product": {"id": "841023781723"}, } } } }, ...

Entonces, esencialmente quiero agrupar primero por fruitType name , luego por plantedIn country , luego por harvestMethod name , y finalmente product id .

Después de investigar un poco, descubrí que lodash es popular para este tipo de agrupación. Desarrollé una solución muy ingenua con sus métodos chain , groupBy y mapValues así:

 const _ = require('lodash'); const groupedData = _.chain(data) .groupBy('fruitType.name') .mapValues(values => _.chain(values) .groupBy('plantedIn.country') .mapValues(values => _.chain(values) .groupBy('harvestMethod.name') .mapValues(values => _.chain(values) .groupBy('product.id') .value() ).value() ).value() ).value()

Esta solución, aunque funcional, se siente muy detallada y probablemente ineficiente. Por lo tanto, me gustaría preguntar si hay alguna alternativa mejor, ya sea con loadash o de otra manera.

about 4 years ago · Santiago Trujillo
2 Respuestas
Responde la pregunta

0

Ya hay una respuesta, pero aquí hay quizás una solución más legible.

 const grouped = items.reduce((acumm, current, index) => { acumm[current.fruitType.name] = { [current.plantedIn.country]: { [current.harvestMethod.name]: { [current.product.id]: current, ...(acumm[current.fruitType.name]?. [current.plantedIn.country]?. [current.harvestMethod.name] ?? {} ), }, }, }; return acumm; }, {});

Ejemplo de Stackblitz

about 4 years ago · Santiago Trujillo Denunciar

0

Puede tomar una serie de funciones para obtener las claves y construir la estructura.

 const data = [{ fruitType: { name: "bananas" }, plantedIn: { country: "USA", state: "Minnesota" }, harvestMethod: { name: "manual" }, product: { id: "841023781723" } }], keys = [o => o.fruitType.name, o => o.plantedIn.country, o => o.harvestMethod.name, o => o.product.id], result = data.reduce((r, o) => { keys.reduce( (q, fn, i, { length }) => q[fn(o)] ??= i + 1 === length ? o : {}, r ); return r; }, {}); console.log(result);
 .as-console-wrapper { max-height: 100% !important; top: 0; }

about 4 years ago · Santiago Trujillo 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