Фильтр после нескольких значений - PullRequest
0 голосов
/ 12 июня 2018

У меня есть модал, который служит для фильтрации элементов на основе фильтров, моя проблема в том, что я могу дать им в качестве фильтра только заголовок, в то время как я также хотел бы указать автора и год для другого ввода текста.

Это моя функция modal.ts для фильтрации только заголовка (я хочу также отфильтровать заголовок, автора и годы)

filterItems() {
     this.filteritems = this.items.filter(item =>item.title.toLowerCase().indexOf(this.searchTerm.toLowerCase()) > -1);
}

Это пример моего json:

[
 {
   "id":"1",
   "author": "Chinua Achebe",
   "country": "Nigeria",
   "imageLink": "images/things-fall-apart.jpg",
   "language": "English",
   "link": "https://en.wikipedia.org/wiki/Things_Fall_Apart\n",
   "pages": 209,
   "title": "Things Fall Apart",
   "year": 1958
 }
]

Ответы [ 3 ]

0 голосов
/ 13 июня 2018

Для удобства чтения я бы сказал, что используйте что-то вроде этого:

filterItems() {
  const searchTerm = this.searchTerm.toLowerCase();

  this.filterItems = this.items.filter(item =>
       item.title.toLowerCase().includes(searchTerm)
    || item.author.toLowerCase().includes(searchTerm)
    || item.years == searchTerm)
}

Этот подход очень удобочитаем, так как мы можем точно видеть, по чему мы фильтруем.

Кроме того, вот документация для String.prototype.includes .

0 голосов
/ 13 июня 2018

Попробуйте это:

// Filter input fields object
var filterData = {
  "title" : "Things You dont know",
  "author": "Rohit Jindal",
  "year": 1953
};

// Data object
var items = [
 {
   "id":"1",
   "author": "Chinua Achebe",
   "country": "Nigeria",
   "imageLink": "images/things-fall-apart.jpg",
   "language": "English",
   "link": "https://en.wikipedia.org/wiki/Things_Fall_Apart\n",
   "pages": 209,
   "title": "Things Fall Apart",
   "year": 1958
 },{
   "id":"2",
   "author": "Rohit Jindal",
   "country": "Nigeria",
   "imageLink": "images/things-fall-apart.jpg",
   "language": "English",
   "link": "https://en.wikipedia.org/wiki/Things_Fall_Apart\n",
   "pages": 209,
   "title": "Things You dont know",
   "year": 1953
 },{
   "id":"3",
   "author": "Author Name",
   "country": "Nigeria",
   "imageLink": "images/things-fall-apart.jpg",
   "language": "English",
   "link": "https://en.wikipedia.org/wiki/Things_Fall_Apart\n",
   "pages": 209,
   "title": "Welcome to JavaScript",
   "year": 1947
 }
];

// Logic to check for all the three filters data and give the output
var filteredItems = items.filter(obj => {
   if ((obj.title.toLowerCase().indexOf(filterData.title.toLowerCase()) > -1) &&
       (obj.author.toLowerCase().indexOf(filterData.author.toLowerCase()) > -1) &&
       (obj.year == filterData.year)) {
       return obj;
     }
});

console.log(filteredItems);

Примечание: В соответствии с ОП, я предполагаю, что все три поля (название, автор и год) являются обязательными.

0 голосов
/ 13 июня 2018

Вы можете объединить все поля, по которым вы хотите фильтровать, и протестировать составную строку:

this.filteritems = this.items.filter(item 
  => (item.title + item.author + item.year).toLowerCase().indexOf(this.searchTerm.toLowerCase()) > -1);})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...