2016-11-02 4 views
1

У меня есть угловая 2 труба поиска, которая фильтрует массив из массива Project []. Он работает для каждого свойства, кроме одного, содержащего массив строк.Угловой 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'] 
}] 

Здесь данных является SearchPipe -

не искать против Итогового массива

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

}

Любая помощь была бы высоко оценена - Спасибо!

ответ

2

Ваш неверный неверный. Он не возвращает true или false. Вы можете изменить свой канал на что-то вроде этого и искать, если он содержит что-то в строке, а затем возвращать логическое значение соответственно.

Как так:

@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 я видел его работы (https://plnkr.co/edit/ntyDUEwe0HXwjeupqDUr?p=preview)

0

Проблема заключается в том, что цикл 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; 
    } 
} 

Это проверялось, и не очень еще. Но вы получаете общую идею

Смежные вопросы