我想知道为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
方法更快或性能更好的列表?
答案 0 :(得分:1)
进行一些测试,似乎所有传统循环对于大型数组来说比过滤器快三倍(或多或少),但更详细。我想我只是为了清晰起见而坚持过滤。
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]);