Arrays 具有数组属性的Angular 2搜索管道过滤器对象

Arrays 具有数组属性的Angular 2搜索管道过滤器对象,arrays,angular,Arrays,Angular,我有一个Angular 2搜索管道,可以过滤项目[]数组。它适用于除包含字符串数组的属性之外的所有属性 这是一个数据模型示例 [{ 'Id': 2, 'Title': 'Abc', 'Amount': '200', 'Outcome': ['Outcome 2', 'Outcome 22', 'Outcome 222', 'Outcome 2222'] }, { 'Id': 3, 'Title': 'Abc',

我有一个Angular 2搜索管道,可以过滤项目[]数组。它适用于除包含字符串数组的属性之外的所有属性

这是一个数据模型示例

[{
    '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']
}]
这是搜索管道-

不搜索结果数组

}


任何帮助都将不胜感激-谢谢

问题在于您执行的
forEach
循环中。返回
true
false
并不能达到预期效果

解决方案是将此逻辑移动到单独的功能:

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;
  }
}

它还没有经过测试,而且还不漂亮。但是你得到了一个大概的想法,你的想法是错误的。它不会返回真或假。您可以将管道更改为类似这样的内容,并搜索它是否包含字符串中的内容,然后相应地返回布尔值

像这样:

@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))
                          });

              }
          });
      }
  }
}
还要检查一下我曾经看到过的plunker()

@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))
                          });

              }
          });
      }
  }
}