简体   繁体   English

具有数组属性的Angular 2 Search Pipe过滤器对象

[英]Angular 2 Search Pipe filter objects with array property

I have Angular 2 Search Pipe that filters against an array of Project[]. 我有Angular 2搜索管道,可以对Project []数组进行过滤。 It works for every property except for one containing an array of strings. 它适用于除包含字符串数组的每个属性以外的所有属性。

Here is a sample of data model 这是数据模型的样本

[{
    'Id': 2,
    'Title': 'Abc',        
    'Amount': '200',
    'Outcome': ['Outcome 2', 'Outcome 22', 'Outcome 222', 'Outcome 2222']
},
{
    'Id': 3,
    'Title': 'Abc',        
    'Amount': '300',
    'Outcome': ['Outcome 3', 'Outcome 333', 'Outcome 3333', 'Outcome 33333']
}]

Here is the SearchPipe - 这是SearchPipe-

not searching against Outcome array 不针对结果数组进行搜索

export class SearchPipe implements PipeTransform {
transform(value, args?): Project[] {
    let searchText = new RegExp(args, 'ig');
    if (value) {
        return value.filter(project => {
            if (project) {
                return project.Title.search(searchText) !== -1
                    || project.Focus.search(searchText) !== -1
                    || project.Outcome.forEach(outcome => {
                        if (outcome.search(searchText) !== -1) {
                            return true;
                        }
                        else {
                            return false;
                        }
                    });
            }
        });
    }
}

} }

Any Help would be much appreciated - Thank you! 任何帮助将不胜感激-谢谢!

Your foreach is incorrect. 您的foreach错误。 It doesnt return true or false. 它不会返回true或false。 You can change your pipe to something like this and search if it contains something in the string and then return a boolean accordingly. 您可以将管道更改为类似内容,并搜索字符串中是否包含某些内容,然后相应地返回布尔值。

Like so: 像这样:

@Pipe({name: 'Search'})
export class Search implements PipeTransform {
  transform(value, args?) {
      let searchText = 'test';

      if (value) {
          return value.filter(project => {
              if (project) {
                  return  !project.Outcome.every(outcome => {
                              return (!outcome.includes(searchText))
                          });

              }
          });
      }
  }
}

Also check the plunker I used to see it working ( https://plnkr.co/edit/ntyDUEwe0HXwjeupqDUr?p=preview ) 还要检查我曾经看到它工作的柱塞( https://plnkr.co/edit/ntyDUEwe0HXwjeupqDUr?p=preview

The problem lies within the forEach loop you do. 问题出在您做的forEach循环之内。 Returning true or false doesn't do what you expect. 返回truefalse不会满足您的期望。

A solution would be to move this logic to a separate function: 一种解决方案是将该逻辑移至单独的函数:

export class SearchPipe implements PipeTransform {
   transform(value, args?): Project[] {
    let searchText = new RegExp(args, 'ig');
      if (value) {
        return value.filter(project => {
            if (project) {
                return project.Title.search(searchText) !== -1
                    || project.Focus.search(searchText) !== -1
                    || this._checkArray(project.Outcome, searchText);
            }
        });
    }
  }

  _checkArray(arr, search) : boolean {
      let found: boolean = false;
      arr.forEach(outcome => {
                        if (outcome.search(search) !== -1) {
                            return true;
                        }
                    })
      return found;
  }
}

It's untested, and not pretty yet. 它未经测试,还不是很漂亮。 But you get the general idea 但是你有一般的想法

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM