我有一个搜索输入,可让我根据用户输入的内容过滤列表的结果。 尽管我想同时从搜索输入和列表中删除所有非字母字符,所以它们可以找到匹配项。
这是我目前拥有的:
let searchInput = '' // whatever the user types
let result = list.filter(element => element.name.match(new RegExp(searchInput, 'i')))
.sort((a, b) => true * a.name.localeCompare(b.name))
答案 0 :(得分:1)
您可以使用正则表达式/[\W_]+/
替换非单词字符。
不清楚是要替换现有数据还是创建新的过滤列表。我以后再假设。
首先使用map()
创建一个列表,其中删除了非单词字符,然后从搜索输入中删除了非单词字符。然后只是过滤。您可以根据需要将它们链接起来:
let searchInput = 'he*(llo' // whatever the user types
let list = [
{name: '#hello'},
{name: 'he$llo'},
{name: 'someevalue'},
{name: 'what'},
{name: 'hello%'}
]
let re = new RegExp(/[\W_]+/i)
let cleaned_list = list.map(i => (i.name = i.name.replace(re, ''), i))
let cleaned_input = searchInput.replace(re, '')
let result = cleaned_list.filter(element => element.name.match(new RegExp(cleaned_input)))
console.log(result)
如果您只想基于不包含非字符词的字符串进行匹配,而又想在最终结果中使用原始术语,请不要先清除列表,而只需在过滤时清除每个元素即可:
let searchInput = 'he*(llo' // whatever the user types
let list = [
{name: '#hello'},
{name: 'he$llo'},
{name: 'someevalue'},
{name: 'what'},
{name: 'hello%'}
]
let re = new RegExp(/[\W_]+/i)
let cleaned_input = searchInput.replace(re, '')
let result = list.filter(element => element.name.replace(re, '').match(new RegExp(cleaned_input)))
console.log(result)