[英]How to change property of parent element if at least one child selected?
I have a tree of nodes of type LayerNode
.我有一棵
LayerNode
类型的节点树。 Where each node as children and parent reference.其中每个节点作为子节点和父节点的引用。
I try to change property of parent if at least one child element has property selected = true
.如果至少一个子元素具有属性
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);
});
}
At the same time if parent is selected
I need to set selected
for all immediate children.同时,如果
selected
了父母,我需要为所有直系子女设置selected
。
Problem is if one of children has selected
the function above selects all children from last children to the root.问题是,如果其中一个孩子
selected
了上面的函数,则选择从最后一个孩子到根的所有孩子。
My second attempt:我的第二次尝试:
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);
});
}
}
Case 1:情况1:
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:案例3:
Parent 1 (selected)
Child 1
Child 2
Child 3 (selected)
Child 3.1 (selected)
Editing:编辑:
public recursiveSelectLayers(node: LayerNode) {
if (node.id) this.flatlayers.set(node.id, node);
if (node.children) {
node.children.forEach(this.recursiveSelectLayers, this);
node.selected =
[...node.children].some((node) => node.selected) ||
node?.parent?.selected;
}
}
I try this... but I'm testing it.我试试这个......但我正在测试它。 Passed 4 cases.
通过4例。
function recursiveSelectLayers(node) { if (node.children) { node.children.forEach((childNode) => { if (node.parent && node.selected) { node.parent.selected = true; } recursiveSelectLayers(childNode); }); } if (node.parent && node.parent.selected) { node.selected = true; } 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>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.