Necesito aplanar el objeto anidado en una matriz de objetos. Hasta ahora esto es lo que se me ocurrió. Pero no está funcionando correctamente. Actualmente estoy comprobando si el elemento actual es un objeto o no, si es un objeto, estoy llamando a la misma función de forma recursiva.
Como salida necesito esto.
[ {title: 'Foo', value: 111}, {title: 'Bar', value: 222}, ... ] var data = { 1: { title: "Foo", value: 111, children: { 2: { title: "Bar", value: 222, }, }, }, 3: { title: "Baz", value: 333, children: { 4: { title: "Qux", value: 444, children: { 5: { title: "Quux", value: 555, }, }, }, }, }, }; const finalArrayOfObjects = []; const flattenObject = (obj) => { const flattened = {}; Object.keys(obj).forEach((key) => { if (typeof obj[key] === "object" && obj[key] !== null) { flattenObject(obj[key]); } else { flattened[key] = obj[key]; } finalArrayOfObjects.push(flattened); console.log(flattened); }); };Aquí hay una forma, usando una función generadora recursiva.
var data = { 1: { title: "Foo", value: 111, children: { 2: { title: "Bar", value: 222, }, }, }, 3: { title: "Baz", value: 333, children: { 4: { title: "Qux", value: 444, children: { 5: { title: "Quux", value: 555, }, }, }, }, }, }; function *forAllChildren(obj) { for (let key in obj) { let { children, ...objWithoutChildren} = obj[key]; yield objWithoutChildren; yield *forAllChildren(obj[key].children); } } const result = [...forAllChildren(data)] console.log(result);Espero que esto funcione para ti
var finalArrayOfObjects = []; var flattenObject = (obj) => { for(var key in obj) { // { title , value, children} var data = obj[key] if (data.children) { // data.children = { key : {title , value, children} } flattenObject(data.children) } finalArrayOfObjects.push({ title : data.title, value : data.value, }) } } flattenObject(data) console.log(finalArrayOfObjects)Es hora de demostrar una vez más el poder de la programación funcional y la recursividad
var data = { 1: { title: "Foo", value: 111, children: { 2: { title: "Bar", value: 222, }, }, }, 3: { title: "Baz", value: 333, children: { 4: { title: "Qux", value: 444, children: { 5: { title: "Quux", value: 555, }, }, }, }, }, }; const dictAsArray = Object.values(data); const flat = []; function drill(array) { array.map(obj => { recursiveCall(obj); }); } function recursiveCall(obj) { if (obj.children) { const children = JSON.parse(JSON.stringify(Object.values(obj.children))); delete obj.children; drill(children); } flat.push(obj); } dictAsArray.map(dict => recursiveCall(dict)); console.log(flat); En este enfoque, los objetos secundarios se eliminan de cada objeto. Sin embargo, si desea que permanezcan, simplemente puede eliminar delete obj.children .