如何检查所有节点是否使用pipe启用?



我试着写一个管道,它接受一个节点并检查是否所有子节点都启用了(不包括父节点):

@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;
});
}
}
}

但是我还没有测试过这个,如果这个例子不适合你,请告诉我。

最新更新