为提前输入筛选数组的最快方法

Fastest method to filter an array for typeahead

本文关键字:方法 数组 筛选 输入      更新时间:2023-09-26

我想知道为提前输入过滤对象数组的最快方法是什么?

给定一个包含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]);