Можем ли мы использовать функцию .filter () с условными правилами для искомых свойств? - PullRequest
2 голосов
/ 05 марта 2019

Предположим, что у нас есть следующая функция .filter:

search(searchQuery: string) {
  let results = myArray.filter(item => 
    item.title.toLowerCase().includes(searchQuery) ||
    item.description.toLowerCase().includes(searchQuery)
  );

  return results;
}

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

ОШИБКА TypeError: Невозможно прочитать свойство 'toLowerCase' с неопределенным значением

Как мы можем все еще искать в массиве и включать свойство description в поиск, только если оно существует? Возможно ли это в функции .filter()?

Ответы [ 3 ]

5 голосов
/ 05 марта 2019

Можно принять значение по умолчанию.

Либо напрямую

(item.description || '').toLowerCase().includes(searchQuery)

, либо выполнить деструктуризацию со значениями по умолчанию.

results = myArray.filter(({ title = '', description = '' }) => 
    title.toLowerCase().includes(searchQuery) ||
    description.toLowerCase().includes(searchQuery)
);
1 голос
/ 05 марта 2019

Вы можете сделать что-то вроде этого:

const myArray = [
    {
        title: 'Test 123',
    },
    {
        title: 'Test 123',
        description: 'test',
    },
    {
        title: 'What',
    },
    {
        title: 'Fix',
        description: '456123',
    },
];

const search = (text) => {
    let results = myArray.filter(item => {
        if (item.description) {
            return item.title.toLowerCase().includes(text) || item.description.toLowerCase().includes(text);
        }
    });
  
    return results;
}

const results = search('test');

console.log(results);
0 голосов
/ 05 марта 2019
search(searchQuery: string) {
  return myarray.filter(item => 'description' in item
    ? item.description.toLowerCase().includes(searchQuery)
    : item.title.toLowerCase().includes(searchQuery)
  );
}

Возможно, вы захотите сделать такую ​​же проверку и для title, но как далеко вы пойдете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...