【发布时间】:2021-05-06 23:17:40
【问题描述】:
我正在尝试使用与用户在输入中写入的字符串匹配的元素来过滤对象。我正在使用 autosuggest 来呈现建议。 这是我到目前为止所拥有的:
<Autosuggest
suggestions={options}
onSuggestionsFetchRequested={fetchOptions}
onSuggestionsClearRequested={() => setOptions([])}
getSuggestionValue={getSuggestionValue}
renderSuggestion={renderSuggestion}
inputProps={inputProps}
/>
我有一个道具的所有选项,我想过滤这些选项以显示与输入匹配的选项,这就是我现在过滤的方式:
const fetchOptions = async ({ value }) => {
setSelected(null);
value = value.toLowerCase();
const results = props.completeOptions.filter(
(v) => v.label.toLowerCase().indexOf(value) != -1
);
setOptions(limit(results)); //Here i'm setting the options hook that i use on the suggestions
};
这是我在 redux 上拥有的 completeOptions 属性的值:
[
{
"id": "1",
"label": "33 Red Case"
},
{
"id": "2",
"label": "Blue Case"
},
{
"id": "3",
"label": "1 Green Case"
},
...
]
现在,如果我输入例如“Case”(这显示 3 个标签),如果我使用“33”(显示第一个标签),但如果我输入“33 case”不显示,这将完美运行任何东西,它应该显示第一个选项。
我该如何解决这个问题?是否方便拆分值并逐个搜索,是否将整个字符串一起搜索更好?
【问题讨论】:
-
indexOf和类似的字符串匹配器不是“模糊的”,它们正在寻找与您的字符串完全匹配的内容,包括空格。在您的示例中,“33 case”在completeOptions中没有匹配项,因为唯一的潜在匹配项在“33”和“case”之间具有其他内容。拆分值是一种选择,或者使用基于正则表达式的匹配器。
标签: reactjs filter autosuggest