javascript - 优化对象数组的搜索
问题描述
我有一个长度为 5,866 的对象数组,像这样格式化{label: "Luke Skywalker", value: "556534"}
,我正在搜索对象并按它们的标签过滤,就像这样
onChange = (e) => {
e.persist()
this.setState({filter:e.target.value, filtered_array:
this.state.raw_user_list.filter(user =>
user.label.toLowerCase().indexOf(e.target.value.toLowerCase()) > -1)})
}
...
<form style={{paddingBottom:'10px'}}>
Filter: <input name="filter" value={this.state.filter} onChange={this.onChange} type="text" style={{
border: '1px solid #cccccc',
}}/>
</form>
this.state.filter
是要输入过滤的值。在我最初使用少于 1,000 个条目之前,现在使用user_list
5,866 个会导致我的过滤方式出现性能问题。我想在用户输入时实时过滤数据。
解决方案
我可以想到 2 种方法来优化您的搜索功能:
使用includes
而不是indexOf
,它不返回索引,而只返回真/假
this.state.raw_user_list.filter(user => user.label.toLowerCase().includes(e.target.value.toLowerCase()))
根据这个堆栈溢出答案,正则表达式会快很多(特别是对于 Chrome):
this.state.raw_user_list.filter(user => user.label.match(new RegExp(e.target.value, 'i')))
在您的正则表达式中使用“i”选项意味着它不区分大小写
更新
根据这些测试,您的函数可以比使用缓存正则表达式的前一个函数更快:
const rValue = new RegExp(e.target.value, 'i')
this.state.raw_user_list.filter(user => rValue.test(user.label))
推荐阅读
- javascript - 单击自身以及其他按钮时更改按钮的图像源属性
- javascript - Ionic 应用程序在初始化完成之前开始工作
- jquery - 具有动态创建表的数据表
- linux - 如何将 linux 中的 vcpkg 与交叉构建工具链以及 sysroot 集成?
- batch-file - 如何使用批处理解决此问题(过滤程序)?
- python - 从顶部的路径数创建顶部对,创建连续图,只有一个选项
- python - 如何比较 URI 编码的字符串?
- javascript - 如何仅禁用 chrome 中的“调试器”关键字,该关键字由循环内的 eval 执行?
- python-3.x - 在 python3 中使用 GraphQL Payload 发布请求
- c - 递归穿越迷宫并在所有空间中插入节点