所以我已将此数据存储在状态中:
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
,然后依次过滤位置并仅返回匹配名称,这种作品,但我一直得到错误的结果。
例如:对于a searchQuery 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
,如果我像Cafe
一样完成了searchQuery,结果就是Bellagio Hotel and Casino
Caesars Palace Las Vegas Hotel & Casino
[当我用纯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);
编辑:这本身不是答案,但是我认为我不能在评论中使用与此片段相同的东西。