【问题标题】:Fastest method to filter an array for typeahead过滤数组以进行预输入的最快方法
【发布时间】:2016-11-02 18:08:07
【问题描述】:

我想知道为预先输入过滤一组对象的最快方法是什么?

给定一个包含 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 方法更快或性能更好的过滤列表的方法?

【问题讨论】:

  • 那个过滤器还能用吗?如果list 包含对象,则调用reg.test({name: "ben"}) 似乎不起作用...您也需要查看“去抖动”您的方法调用。
  • 这真的取决于实际数据。可能删除RegExp 调用会使其更快。对于示例数据,我会将数组展平为所有设置为小写的名称,然后将输入小写,并与indexOf 进行比较。在比较性能时,获得“正确”答案的唯一方法是尝试一些东西,测试,然后尝试其他东西。
  • 谢谢迈克!你是对的,我将不得不更新我的例子,过滤器 RegEx 才能工作。你是对的,测试和查看有效的方法是要走的路。我没有想到字符串数组的索引。谢谢!

标签: javascript arrays performance


【解决方案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]);

【讨论】:

  • 在我的测试中平均 72 毫秒和 46 毫秒。我不确定这是否有显着差异,特别是因为测试运行之间的可变性(我在一次运行中获得了 123 毫秒 filter)比两次测试之间的差异更大。
  • 这里我或多或少地得到 99 毫秒和 30 毫秒,尽管我同意你的观点,因为它根本不重要。就像我说的那样,尽管我对传统的循环时间感到好奇,但我还是会选择过滤器。谢谢!
  • 谢谢。我不知道console.time。这就是我问的原因。我不确定如何测试不同的实现。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-31
  • 2016-12-29
  • 1970-01-01
  • 2015-02-20
  • 2021-11-03
  • 2021-07-10
  • 1970-01-01
相关资源
最近更新 更多