如何制作可用于多级对象数组的过滤器管道

问题描述

我正在寻找解决方案来改进可以搜索多个级别的管道。

我当前的管道没有通过所有级别,导致搜索结果不正确。

示例:

当我输入 ab 时,我没有得到所有与 ab 匹配的结果。

它只搜索非嵌套元素。

下面是我的stackblitz。

https://stackblitz.com/edit/angular-929hve

解决方法

你能替换你的代码块吗

return filterKeys.some((keyName) => {
                            return new RegExp(filter[keyName],'gi').test(item[keyName]) || 
                            new RegExp(filter[keyName],'gi').test(item.data[keyName]) ||
                            filter[keyName] == "";
                        });

这样:

return (
                new RegExp(filter[keyName],"gi").test(item[keyName]) ||
                new RegExp(filter[keyName],"gi").test(item.data[keyName]) ||
                new RegExp(filter[keyName],"gi").test(item.data.data) ||
                filter[keyName] == ""
              );

如果您注意到,我在此处添加了另一行,这将根据您的数据结构修复嵌套。

此外,为了使搜索适用于所有字段,在遍历键时您的代码中存在一个小错误。用以下代码替换 else 块的内容:

let keys = [];
        return items.filter(item => {
          keys = Object.keys(item);
          keys.push(...Object.keys(item.data));
          return keys.some(keyName => {
            console.log(keyName);
            return (
              new RegExp(filter,"gi").test(item[keyName]) ||
              new RegExp(filter,"gi").test(item.data[keyName]) ||
              new RegExp(filter,"gi").test(item.data.data) ||
              filter[keyName] == ""
            );
          });
        });