用于过滤类型的最快方法

时间:2016-11-02 18:08:07

标签: javascript arrays performance

我想知道为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方法更快或性能更好的列表?

1 个答案:

答案 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]);