为提前输入筛选数组的最快方法
Fastest method to filter an array for typeahead
我想知道为提前输入过滤对象数组的最快方法是什么?
给定一个包含10000个或更多项目的列表,如下所示:
[{name: "ben"}, {name: "Alex"}, {name: "mary"}]
我可以使用Array.prototype.filter
方法过滤它们,但是在得到结果之前我看到相当多的滞后时间。有没有更好的方法来过滤基于键盘输入的大列表?
这是我当前的实现:
const list = [{...}] //list of 10000 or more objects with a name property
function getFilteredList(input) {
const reg = new RegExp(input.toLowerCase(), 'i');
return list.filter(i => reg.test(i.name));
}
是否有一种方法可以比使用Array.prototype.filter
方法更快或具有更好的性能来过滤列表?
做了几个测试,似乎所有传统循环对于大数组都比过滤器快三倍(或多或少),尽管更冗长。为了清晰起见,我还是用过滤器吧。
const list = []; //list of 10000 or more objects with a name property
var res;
for (var i = 0; i < 1000000; i++) {
list.push({
name: "a" + i
});
}
function getFilteredList(input) {
const reg = new RegExp(input.toLowerCase(), 'i');
return list.filter(i => reg.test(i.name));
}
function getFilteredList2(input) {
const reg = new RegExp(input.toLowerCase(), 'i');
let len = list.length;
let i = 0;
let res = [];
let el;
while (i !== len) {
el = list[i++];
if (reg.test(el.name)) {
res.push(el);
}
}
return res;
}
console.time("Filter test");
res = getFilteredList('a999999');
console.timeEnd("Filter test");
console.log(res[0]);
console.time("Filter test2");
res = getFilteredList2('a999999');
console.timeEnd("Filter test2");
console.log(res[0]);
相关文章:
- 数组在递归方法中设置为null
- 有没有一种方法可以添加相同的项目val=“0”;4〃;到JavaScript中数组的每个对象
- Javascript,有没有一种方法可以将数组写成没有逗号或空格的单个文本字符串
- 是否有任何方法可以使用jQuery替换在数组中定义值的文本
- 用于检查数组中是否存在元素的javascript自定义方法
- call()和apply()实际上是用来欺骗方法处理类似数组的对象的
- 从数组中删除元素的最佳方法是:javascript/jquery
- knex:根据结果创建数组的合适方法是什么
- 将数组从javascript格式化为php的更好方法,反之亦然
- 如何创建一个方法来验证数组的范围
- 使用filter和map方法将数组中某些元素的第一个字母大写-JavaScript
- 解析带有嵌入式数组的JSON对象,方法
- 查找对象数组是否包含其中一个标记的最快方法
- 如何用Typescript用自定义方法实现类数组
- 在 JavaScript 数组中的所有元素之间穿插元素的简洁方法
- 使用Underscore.js修改json数组中所选元素的更有效方法
- 选择具有值数组的所有元素的最有效方法
- JavaScript 中的范围(为什么在 $.post() 方法数组的作用域是本地的?)
- Javascript方法不填充方法(数组)
- Objects筛选方法数组中的THIS关键字