Проблема у вас в том, что все, что задает данные, устанавливает свойства равными нулю.Поэтому, когда вы проверяете это, он выдает ошибку.
Вы можете усложнить свой код и проверить, насколько он правдив, прежде чем делать это.
(item.companyName && item.companyName.toLowerCase().indexOf(keyword) > -1) ||
(item.primaryPhone && item.primaryPhone.toLowerCase().indexOf(keyword) > -1) ||
Лично я бы не стал этого делать и использовал бы some
и includes
.
Определите массив полей для проверки
const fields = ['companyName','primaryPhone','emailAddress','venueCode','website','description']
И в своем коде фильтра используйте some и loop over и посмотрите, верны ли они и соответствуют ли они
let filtered = keyword.length
? this.state.data.filter(item =>
fields.some(prop =>
item[prop] && item[prop].toLowerCase().includes(keyword)
)
)
: []
Следующая проблема с вашим кодом - это
if(this.state.filtered.length>0 || !this.state.filtered.length)
Первое утверждение говорит, что если больше нуля, а второе равно нулю.Поэтому не уверен, что вы ожидаете, что произойдет.
Следующий вопрос, который у вас есть, это то, что вы читаете this.state.filtered.Проблема в том, что вы установили его прямо с this.setState(....)
.Проблема в том, что setState является асинхронным, поэтому проверяемое вами значение не будет там.У вас есть переменная filtered
, поэтому используйте ее.
if (!filtered.length)