【问题标题】:make a dynamic filter in Angular在 Angular 中做一个动态过滤器
【发布时间】:2018-11-07 15:34:15
【问题描述】:

我有一个可以跨组件重复使用的管道。通常在搜索时。

HTML 看起来像这样,你可以看到我有一个包含“plantNumber”和“shortDescription”的数组,但它可能是一个无穷无尽的属性列表

*ngFor="let workOrder of workOrders | filterArrayPipe: ['plantNumber', 'shortDescription']: searchFilter"

过滤器看起来像这样

import { Pipe, PipeTransform } from '@angular/core';

@Pipe({
  name: 'filterArrayPipe'
})
export class FilterArrayPipe implements PipeTransform {
  transform(value: any, config: any, q: string) {
    if (config && q) {
      return value.filter(result => {
        return result[config[0]].toString().toLowerCase().indexOf(q) > -1 
          || result[config[1]].toString().toLowerCase().indexOf(q) > -1;
      });
    } else {
      return value;
    }
  }
}

但我希望它看起来更像这样

import { Pipe, PipeTransform } from '@angular/core';

@Pipe({
  name: 'filterArrayPipe'
})
export class FilterArrayPipe implements PipeTransform {
  transform(value: any, config: any, q: string) {
    if (config && q) {
      return value.filter(result => {
        for (let i = 0; i < config.length; i ++) {
          const type = config[i];
          return result[type].toString().toLowerCase().indexOf(q) > -1;
        }
      });
    } else {
      return value;
    }
  }
}

所以问题是,我将如何添加“和”||在返回语句中?

【问题讨论】:

    标签: arrays angular filter config


    【解决方案1】:

    由于 for 循环中的返回,它只会检查第一个 config 项目。

    相反,您可以执行以下操作:

      return value.filter(result => {
        for (let i = 0; i < config.length; i ++) {
          const type = config[i];
          if (result[type].toString().toLowerCase().indexOf(q) > -1) {
            return true;
          }
        }
        return false;
      });
    

    这样,它将尝试config数组中的每个值,如果没有找到匹配项,则只返回false。

    或者,使用some 函数,您可以执行以下操作:

      return value.filter(result => {
        return config.some((type) => result[type].toString().toLowerCase().indexOf(q) > -1)
      });
    

    【讨论】:

    • @Johansrk 没有问题 - 很高兴为您提供帮助。 附言我知道之前已经提到过,但是使用管道过滤器,尤其是带有嵌套 for 循环的管道,在每次迭代时调用 .toLowerCase,这将是一个非常缓慢的解决方案。这个函数会在每个变化检测周期被调用
    • 除了管道之外还有什么解决方案?
    • 将该函数复制到您的组件中,并在您想要重新过滤数据时(即过滤字符串更改时)自己调用它
    猜你喜欢
    • 2019-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-08
    • 2023-03-12
    相关资源
    最近更新 更多