Estoy teniendo una matriz como esta
[ { object1:{ childObj1:[grandChild1,grandChild2], childObj1, childObj1} }, { object2:{ childObj1:[grandChild1,grandChild2], childObj1, childObj1} }, { object3:{ childObj1:[grandChild1,grandChild2], childObj1, childObj1} }, ]
Ahora quiero deshacerme de todos los elementos anidados que tienen más de un elemento y mantener solo el primero, como:
[ { object1:{ childObj1:[grandChild1]} }, { object2:{ childObj2:[grandChild1]} }, { object3:{ childObj3:[grandChild1]} }, ]
¿Cuál es la forma más efectiva de hacer esto?
const arr = [{ object1: { childObj1: ['grandChild1', 'grandChild2'], childObj3: 't', childObj2: 'r' } }, { object2: { childObj1: ['grandChild1', 'grandChild2'], childObj3: 't', childObj2: 'r' } }, { object3: { childObj1: ['grandChild1', 'grandChild2'], childObj3: 't', childObj2: 'r' } }, ]; console.log(arr.map(el => { const child = el[Object.keys(el)[0]]; const firstProperty = { [Object.keys(child)[0]]: child[Object.keys(child)[0]] }; return { [Object.keys(el)[0]]: firstProperty } }));
Espero que esto sea lo que querías.
Prueba esto:
const arr = [{ object1: { childObj1: ['grandChild1', 'grandChild2'], childObj2: {}, childObj3: {} } }, { object2: { childObj1: ['grandChild1', 'grandChild2'], childObj2: {}, childObj3: {} } }, { object3: { childObj1: ['grandChild1', 'grandChild2'], childObj2: {}, childObj3: {} } }, ] function f(obj, startLevel, currentLevel = 0) { let value if (Array.isArray(obj)) { value = [] } else if (typeof obj === 'object') { value = {} } else { value = obj } if (typeof obj === 'object') { for (let i in obj) { if (currentLevel >= startLevel) { if (Array.isArray(obj[i])) { value[i] = obj[i].length ? [f(obj[i][0], startLevel, currentLevel + 1)] : []; } else { value[i] = f(obj[i], startLevel, currentLevel + 1) } break; } else { value[i] = f(obj[i], startLevel, currentLevel + 1) } } } return value; } console.log(f(arr, 1));