Javascript 如何从mat tree角材质中筛选父级及其关联的子级?
我已经在下拉列表中创建了mat树,并创建了输入字段来进行筛选。如果我从json中键入父/子名称的全文,则过滤器可以工作。但是,我想在键入字符本身时进行筛选。可以在下面的stackblitz中找到示例代码:Javascript 如何从mat tree角材质中筛选父级及其关联的子级?,javascript,angular,angular-material,Javascript,Angular,Angular Material,我已经在下拉列表中创建了mat树,并创建了输入字段来进行筛选。如果我从json中键入父/子名称的全文,则过滤器可以工作。但是,我想在键入字符本身时进行筛选。可以在下面的stackblitz中找到示例代码: 任何人的帮助都将受到感谢对于这种情况,可以使用基本regexp。只需将过滤功能更改为如下所示: public filter(filterText: string) { let filteredTreeData; if (filterText) { // Filte
任何人的帮助都将受到感谢对于这种情况,可以使用基本regexp。只需将过滤功能更改为如下所示:
public filter(filterText: string) {
let filteredTreeData;
if (filterText) {
// Filter the tree
function filter(array, text) {
const getChildren = (result, object) => {
var re = new RegExp(text, 'gi');
if (object.item.match(re)) {
result.push(object);
return result;
}
if (Array.isArray(object.children)) {
const children = object.children.reduce(getChildren, []);
if (children.length) result.push({ ...object, children });
}
return result;
};
return array.reduce(getChildren, []);
}
filteredTreeData = filter(this.treeData, filterText);
} else {
// Return the initial tree
filteredTreeData = this.treeData;
}
// Build the tree nodes from Json object. The result is a list of `TodoItemNode` with nested
// file node as children.
const data = filteredTreeData;
// Notify the change.
this.dataChange.next(data);
}
基本上,我改变了主过滤器的条件:
if (object.item .toLowerCase() === text.toLowerCase() ) {
result.push(object);
return result;
}
为此:
var re = new RegExp(text, 'gi');
if (object.item.match(re)) {
result.push(object);
return result;
}
它所做的是,我们可以使用简单的正则表达式输出部分匹配的元素,而不需要匹配全文
您可以看到。谢谢您的重播。如果我过滤,例如一个孩子“香蕉”,它关联的孩子“苹果”也应该出现。我的意思是父母和孩子也需要被过滤。你看过上面的演示了吗?我不确定我是否完全明白你刚才的意思。如上例所示,当用户在父项中键入时,其关联的子项将显示为父项。是,这是正确的。但是,如果我们键入任何子名称,则该特定父项下的所有子项都应该出现。例如,如果我们输入“苹果”,我们必须得到“水果”、“苹果”、“香蕉”啊,我明白了,你是说那个孩子的兄弟姐妹?孩子在下面,兄弟姐妹在旁边。请注意,您的主要问题是:“我想在键入字符本身时进行筛选。”。所以我认为这应该是坚持下去