我试着写一个管道,它接受一个节点并检查是否所有子节点都启用了(不包括父节点):
@Pipe({ name: 'allchildEnabled', pure: false })
export class AllChildEnabledChildPipe implements PipeTransform {
private enabled = true;
transform<T extends ITreeNode>(node: T): boolean {
this.search(node);
return this.enabled;
}
search<T extends ITreeNode>(node: T) {
if (!node || !this.enabled) return;
if (node?.children) {
node.children.forEach((child: T) => {
this.enabled = child?.enabled;
this.search(child);
});
}
}
}
但这总是告诉我所有的子节点都是启用的(布尔值为true)。
我哪里出错了?
第二次尝试:
function search(node: any): boolean {
if (!node || !node?.enabled) return false;
if (node?.children) {
for (let child of node.children) return search(child);
}
return true;
}
let tree = {id: 1, enabled: true, children: [{id: 2, enabled: true}, {id: 3, enabled: true}, {id: 3, enabled: true, children: [{id: 4, enabled: true}]}]};
console.log(search(tree));
您的forEach函数工作不正确。
在你的例子中,如果最新的孩子将被启用,你将在你的管道中有enabled as true
,但是我如何从你的问题描述中理解你需要使enabled as false
当你至少有一个孩子被禁用(未启用)
试着用这个答案
@Pipe({ name: 'allchildEnabled', pure: false })
export class AllChildEnabledChildPipe implements PipeTransform {
private enabled = true;
transform<T extends ITreeNode>(node: T): boolean {
this.search(node);
return this.enabled;
}
search<T extends ITreeNode>(node: T) {
if (!node || !this.enabled) return;
if (node?.children) {
this.enabled = !node.children.find((child: T) => {
this.search(child);
return !child?.enabled;
});
}
}
}
但是我还没有测试过这个,如果这个例子不适合你,请告诉我。