【问题标题】:Adding multiple fields of an object considered for custom filter添加考虑用于自定义过滤器的对象的多个字段
【发布时间】:2018-05-13 10:43:49
【问题描述】:

我有一个对象 Person 具有 name 和 surname 属性,我按名称创建了一个过滤器,但我想在同一个过滤器中添加另一个过滤器,按姓氏过滤,但我找不到同时存储 p.name ,和 p.surname 在过滤器括号中,是否可以检查同一过滤器中对象的多个字段?

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

@Pipe({
  name: 'filter'
})
export class FilterPipe implements PipeTransform {

  transform(person: Persons[], term: any): any {

    return persons.filter(p => p.name.toLowerCase().indexOf(term.toLowerCase())>-1);
  }
}

【问题讨论】:

    标签: angular filter pipe


    【解决方案1】:

    您可以将过滤器的输入更改为以下内容:

    export interface IFilterProps {
        name: string,
        term: streing
    }
    

    在你的管道内:

    export class FilterPipe implements PipeTransform {
    
      transform(person: Persons[], terms: IFilterProps[] ): any {
          let res: Persons[] = [];
          persons.forEach(
              (person)=>{
                  let valid = true;
                  terms.forEach(
                      (item)=>{
                          if(person[item.name].toLowerCase().indexOf(item.termtoLowerCase())===-1){
                              valid = false;
                          }
                      }
                  )
                  if(valid) {
                      res.push(person)
                  }
              }
          )
          return res
      }
    }
    

    在你的组件中你可以像这样使用它:

    *ngFor="let item of personsArray | filter : [{name: 'name', term: 'someTerm'},{name: 'surname ', term: 'someOtherTerm'}]"
    

    这种方式的好处是它的动态性和可重用性

    【讨论】:

    • 我明天一定会检查这段代码,谢谢你发布这个......很高兴有可重用的代码
    【解决方案2】:

    您也可以使用 && 条件运算符,它应该是人而不是人

    return person.filter(p => p.color.toLowerCase().indexOf(term.toLowerCase())>-1 && p.firstname ==='yourvalue');
    

    【讨论】:

    • 我尝试像这样添加它 return person.filter(p => p.name.toLowerCase().indexOf(term.toLowerCase())>-1 && p.surname.toLowerCase()。 indexOf(term.toLowerCase()) >-1);但我收到一个错误无法读取未定义的属性“过滤器”
    • sry 检查编辑后的评论版本,我按下回车换行但是.. :D
    • 如果 (term===undefined) 返回人,我必须在转换之前添加这个; ,但我仍然不能像这样检查 person.surname return person.filter(p => p.name.toLowerCase().indexOf(term.toLowerCase())>-1 && p.surname.toLowerCase().indexOf (term.toLowerCase())>-1);
    • 什么意思?
    • 我必须添加 if (term===undefined) 因为我无法加载我的视图,因为我将过滤器放入 ngFor 并且由于术语是 [(ngModel)] 它是未定义的所以我不能't get my PersonsTableView
    猜你喜欢
    • 1970-01-01
    • 2020-09-27
    • 2021-07-07
    • 2016-01-21
    • 1970-01-01
    • 2020-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多