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

238
Vistas
construir una matriz de objetos a partir de un objeto de árbol

Estoy tratando de ingresar a la función de reduce incorporada de javascript y con la ayuda de esos objetos de construcción dentro de la matriz. Pero puede usar cualquier función o método que desee.

Rendimiento esperado

 [ { 'team1': [14697807552, 6858384], '2021': [14697807552, 6858384], 'pepsi': [null, null], 'cola': [14697807552, 6858384] }, { 'team2': [10268029152, 6922128], '2021': [10268029152, 6922128], 'pepsi': [null, 4800], 'cola': [10268029152, 6917328] }, ]

lo que traté de hacer

Creé una función que toma una matriz como argumento y llama a reduce para cada elemento de la matriz.

 function transform(arr, obj = {}) { return arr.reduce((acc, item) => { const newObj = {}; newObj[item.name] = item.metrics; acc.push(newObj); if (item.children) { transform(item.children, newObj); } return acc; }, []); } console.log(transform(arr))
 <script> const arr = [{ "name": "team1", "metrics": [ 14697807552, 6858384 ], "children": [{ "name": "2021", "metrics": [ 14697807552, 6858384 ], "children": [{ "name": "pepsi", "metrics": [ null, null ] }, { "name": "cola", "metrics": [ 14697807552, 6858384 ] } ] }] }, { "name": "team2", "metrics": [ 10268029152, 6922128 ], "children": [{ "name": "2021", "metrics": [ 10268029152, 6922128 ], "children": [{ "name": "pepsi", "metrics": [ null, 4800 ] }, { "name": "cola", "metrics": [ 10268029152, 6917328 ] } ] }] } ] </script>

Pero me da una salida que no quiero:

 [ { team1: [ 14697807552, 6858384 ] }, { team2: [ 10268029152, 6922128 ] } ]

Si no entendiste mi pregunta o tienes alguna pregunta, pregúntame. ¡Gracias por prestar atención!

about 4 years ago · Juan Pablo Isaza
3 Respuestas
Responde la pregunta

0

La función transform no hace nada con el segundo argumento obj , por lo que cuando llama recursivamente a transform , newObj no se extiende: esto hace que la llamada recursiva pierda cualquier efecto deseado.

En lugar de pasar ese segundo argumento, podría usar Object.assign para recopilar todos los objetos que regresan de la recursividad y fusionarlos en un solo objeto:

 const convert = arr => arr?.map(({name, metrics, children}) => Object.assign({[name]: metrics}, ...convert(children))) ?? []; const arr = [{"name": "team1","metrics": [14697807552,6858384],"children": [{"name": "2021","metrics": [14697807552,6858384],"children": [{"name": "pepsi","metrics": [null,null]},{"name": "cola","metrics": [14697807552,6858384]}]}]},{"name": "team2","metrics": [10268029152,6922128],"children": [{"name": "2021","metrics": [10268029152,6922128],"children": [{"name": "pepsi","metrics": [null,4800]},{"name": "cola","metrics": [10268029152,6917328]}]}]}]; console.log(convert(arr));

Tenga en cuenta que una propiedad como '2021' es un índice y se ordenará antes que otras propiedades que no son índice. Incluso si imprime un objeto como { 'a': 2, '2021': 1 } obtendrá las claves en orden opuesto por la misma razón.

Si el orden de las claves de objeto es importante para usted, entonces debería optar por una matriz de pares en lugar de un objeto simple. Los arreglos son la estructura elegida cuando se necesita orden, y los objetos simples se deben usar cuando el orden no es esencial.

about 4 years ago · Juan Pablo Isaza Denunciar

0

He encontrado una solución un poco diferente :) Es más larga que la respuesta de @trincot pero también funciona

 const arr = [{"name": "team1","metrics": [14697807552,6858384],"children": [{"name": "2021","metrics": [14697807552,6858384],"children": [{"name": "pepsi","metrics": [null,null]},{"name": "cola","metrics": [14697807552,6858384]}]}]},{"name": "team2","metrics": [10268029152,6922128],"children": [{"name": "2021","metrics": [10268029152,6922128],"children": [{"name": "pepsi","metrics": [null,4800]},{"name": "cola","metrics": [10268029152,6917328]}]}]}]; const handleArr = (list, rez) => { list.forEach((item) => { rez[item.name] = item.metrics; item.children && handleArr(item.children, rez); }); }; const handle = (list) => { const rezArr = []; for (const item of list) { const rezObj = { [item.name]: item.metrics }; item.children && handleArr(item.children, rezObj); rezArr.push(rezObj); } return rezArr; }; console.log(handle(arr));
about 4 years ago · Juan Pablo Isaza Denunciar

0

Este enfoque devuelve un resultado diferente y utiliza toda la información anterior para obtener una desnormalización de los datos.

 const flat = array => array.flatMap(({ name, metrics, children }) => children ? flat(children).map(q => ({ [name]: metrics, ...q })) : { [name]: metrics }), data = [{ name: "team1", metrics: [14697807552, 6858384], children: [{ name: "2021", metrics: [14697807552, 6858384], children: [{ name: "pepsi", metrics: [null, null] }, { name: "cola", metrics: [14697807552, 6858384] }] }] }, { name: "team2", metrics: [10268029152, 6922128], children: [{ name: "2021", metrics: [10268029152, 6922128], children: [{ name: "pepsi", metrics: [null, 4800] }, { name: "cola", metrics: [10268029152, 6917328] }] }] }], result = flat(data); console.log(result);
 .as-console-wrapper { max-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