Использование Regex для сравнения двух строк в React-Native - PullRequest
0 голосов
/ 28 марта 2020

, поэтому я храню эти данные в состоянии:

state={
    locations:[
            {name:"Bellagio Hotel and Casino"},
            {name:"Caesars Palace Las Vegas Hotel & Casino"},
            {name:"Cafe Americano"},
            {name:"Cafe Lola"},
            {name:"Hotel Apache"},
        ],
   searchQuery:""
}

Я отображаю это так:

var filter = new RegExp(this.state.searchQuery.toLowerCase())

this.state.locations.filter((location,index) => filter.test(location.name.toLowerCase()))
.map((location)=>(<Text>{location.name}</Text>))

при первом запуске фильтр равен this.state.searchQuery = "" и все отображаются местоположения, где-то в коде у меня есть поле поиска, которое начинает постоянно меняться this.state.searchQuery, так как вы продолжаете печатать, который затем, в свою очередь, должен фильтровать местоположения и возвращать только совпадающие имена, этот вид работ, но я продолжаю получать неправильные результаты .

Например: для запроса search cafe я должен получить результаты Cafe Lola и Cafe Americano, но в настоящее время я получаю Bellagio Hotel and Casino

Как я могу искать и фильтровать через данные с правильными результатами? или если есть другие способы сделать это без использования Regex

, я также попробовал:

1-location.name.toLowerCase().localeCompare(this.state.searchQuery.toLowerCase()) !== -1
2-location.name.toLowerCase().search(this.state.searchQuery.toLowerCase()) !== -1
3-location.name.toLowerCase().indexOf(this.state.searchQuery.toLowerCase()) !== -1

все они с неточными результатами. с первым searchQuery Ca дает мне Bellagio Hotel and Casino Caesars Palace Las Vegas Hotel & Casino Cafe Americano Cafe Lola, и если я заканчиваю sh поискового запроса, например Cafe, результаты просто Bellagio Hotel and Casino Caesars Palace Las Vegas Hotel & Casino

1 Ответ

0 голосов
/ 28 марта 2020

Когда я express ваш пример в чистом Javascript, фильтр работает как положено. Вы уверены, что проблема не в другом?

var state = {
    locations:[
            {name:"Bellagio Hotel and Casino"},
            {name:"Caesars Palace Las Vegas Hotel & Casino"},
            {name:"Cafe Americano"},
            {name:"Cafe Lola"},
            {name:"Hotel Apache"},
        ],
   searchQuery:"Cafe"
}

var filter = new RegExp(state.searchQuery.toLowerCase())
var results = state.locations.filter((location, index) => filter.test(location.name.toLowerCase()))
.map((location) => (`<Text>${location.name}</Text>)`));
console.log(results);

Редактировать: само по себе это не ответ, но я не думаю, что смогу использовать что-то эквивалентное этому фрагменту в комментарии.

...