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!
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.
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));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; }