Javascript 如何从mat tree角材质中筛选父级及其关联的子级?

Javascript 如何从mat tree角材质中筛选父级及其关联的子级?,javascript,angular,angular-material,Javascript,Angular,Angular Material,我已经在下拉列表中创建了mat树,并创建了输入字段来进行筛选。如果我从json中键入父/子名称的全文,则过滤器可以工作。但是,我想在键入字符本身时进行筛选。可以在下面的stackblitz中找到示例代码: 任何人的帮助都将受到感谢对于这种情况,可以使用基本regexp。只需将过滤功能更改为如下所示: public filter(filterText: string) { let filteredTreeData; if (filterText) { // Filte

我已经在下拉列表中创建了mat树,并创建了输入字段来进行筛选。如果我从json中键入父/子名称的全文,则过滤器可以工作。但是,我想在键入字符本身时进行筛选。可以在下面的stackblitz中找到示例代码:


任何人的帮助都将受到感谢

对于这种情况,可以使用基本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;
          }
它所做的是,我们可以使用简单的正则表达式输出部分匹配的元素,而不需要匹配全文


您可以看到。

谢谢您的重播。如果我过滤,例如一个孩子“香蕉”,它关联的孩子“苹果”也应该出现。我的意思是父母和孩子也需要被过滤。你看过上面的演示了吗?我不确定我是否完全明白你刚才的意思。如上例所示,当用户在父项中键入时,其关联的子项将显示为父项。是,这是正确的。但是,如果我们键入任何子名称,则该特定父项下的所有子项都应该出现。例如,如果我们输入“苹果”,我们必须得到“水果”、“苹果”、“香蕉”啊,我明白了,你是说那个孩子的兄弟姐妹?孩子在下面,兄弟姐妹在旁边。请注意,您的主要问题是:“我想在键入字符本身时进行筛选。”。所以我认为这应该是坚持下去