Tengo un árbol de nodos de tipo LayerNode . Donde cada nodo como hijo y padre referencia.
Intento cambiar la propiedad del padre si al menos un elemento secundario tiene la propiedad selected = true .
public recursiveSelectLayers(node: LayerNode) { if (node.children) node.children.forEach((childNode: LayerNode) => { childNode.parent = node; if (childNode?.parent?.selected) childNode.selected = childNode.parent.selected; if (childNode.selected && childNode.parent) childNode.parent.selected = childNode.selected; this.recursiveSelectLayers(childNode); }); } Al mismo tiempo, si se selected el padre, necesito establecerlo selected para todos los niños.
El problema es que si uno de los niños ha selected la función anterior, selecciona todos los niños desde el último hasta la raíz.
Mi segundo intento:
public recursiveSelectLayers(node: LayerNode) { if (node.parent && node.selected) node.parent.selected = node.selected; if (node.children) { node.children.forEach((childNode: LayerNode) => { if (node?.selected) childNode.selected = node.selected; childNode.parent = node; this.recursiveSelectLayers(childNode); }); } }Caso 1:
Parent 1 (selected) Child 1 Child 2 Child 3 (selected)Caso 2:
Parent 1 (selected) Child 1 (selected) Child 2 (selected) Child 3 (selected)Caso 3:
Parent 1 (selected) Child 1 Child 2 Child 3 (selected) Child 3.1 (selected)Yo iría con esto:
function recursiveSelectLayers(node) { node.children.forEach(recursiveSelectLayers); node.selected = [...node.children].some(({selected}) => !!selected) || node.parent.selected; }Intento esto... pero lo estoy probando. Pasaron 4 casos.
function recursiveSelectLayers(node) { if (node.parent && node.parent.selected) { node.selected = true; } if (node.parent && node.selected) { node.parent.selected = true; } if (node.children) { node.children.forEach((childNode) => { recursiveSelectLayers(childNode); }); } return node } // tests: var case1 = { selected: true, children: [{}, {}, { selected: true }] } case1.children[0].parent = case1; case1.children[1].parent = case1; case1.children[2].parent = case1; var case2 = { selected: true, children: [{ selected: true }, { selected: true }, { selected: true }] } case2.children[0].parent = case2; case2.children[1].parent = case2; case2.children[2].parent = case2; var case3 = { selected: true, children: [{}, {}, { selected: true, children: [{ selected: true }] }] } case3.children[0].parent = case3; case3.children[1].parent = case3; case3.children[2].parent = case3; case3.children[2].children[0].parent = case3.children[2]; var case4 = { children: [{}, {}, { selected: true, children: [{}] }] } case4.children[0].parent = case4; case4.children[1].parent = case4; case4.children[2].parent = case4; case4.children[2].children[0].parent = case4.children[2]; console.log(recursiveSelectLayers(case1)) console.log(recursiveSelectLayers(case2)) console.log(recursiveSelectLayers(case3)) console.log(recursiveSelectLayers(case4)) <pre> Case1: Parent 1 (selected) Child 1 Child 2 Child 3 (selected) Case 2: Parent 1 (selected) Child 1 (selected) Child 2 (selected) Child 3 (selected) Case 3: Parent 1 (selected) Child 1 Child 2 Child 3 (selected) Child 3.1 (selected) Case 4: Parent 1 Child 1 Child 2 Child 3 (selected) Child 3.1 </pre>