let obj = {children:[ { ID:1, clicked: false, children: [ { ID:4, clicked: false, children: [ { ID:11, clicked: false, children: [ { ID:14, clicked: true, }, { ID:15, clicked: true, } ] }, { ID:12, clicked: false, } ] }, { ID:5, clicked: false, } ] } ] }Podría tomar un algoritmo de búsqueda primero en profundidad y si todos los elementos secundarios contienen clicked: true , el elemento principal obtiene una actualización.
const update = object => { if (!object.children) return object.clicked; return object.clicked = object.children.every(update); }, object = { children: [{ ID: 1, clicked: false, children: [{ ID: 4, clicked: false, children: [{ ID: 11, clicked: false, children: [{ ID: 14, clicked: true }, { ID: 15, clicked: true }] }, { ID: 12, clicked: false }] }, { ID: 5, clicked: false }] }] }; update(object); console.log(object); .as-console-wrapper { max-height: 100% !important; top: 0; }Nina dio una gran respuesta para cuando quieres mutar la entrada.
Aquí hay uno simple que crea un nuevo objeto:
const consolidate = ({clicked, children = [], ...rest}, _, __, kids = children .map (consolidate)) => ({ ...rest, clicked: clicked || (kids .length > 0) && kids .every (k => k .clicked), ...(kids .length ? {children: kids} : {}) }) const obj1 = {children: [{ID: 1, clicked: false, children: [{ID: 4, clicked: false, children: [{ID: 11, clicked: false, children: [{ID: 14, clicked: true}, {ID: 15, clicked: true}]}, {ID: 12, clicked: false}]}, {ID: 5, clicked: false}]}]}; // with 12 switched to `true` const obj2 = {children: [{ID: 1, clicked: false, children: [{ID: 4, clicked: false, children: [{ID: 11, clicked: false, children: [{ID: 14, clicked: true}, {ID: 15, clicked: true}]}, {ID: 12, clicked: true}]}, {ID: 5, clicked: false}]}]}; console .log ('obj1', consolidate (obj1)) console .log ('obj2', consolidate (obj2)) .as-console-wrapper {max-height: 100% !important; top: 0} Recurrimos a los elementos children , si los hay, y luego regeneramos el objeto evaluando la propiedad en la que se clicked en cada uno.