【问题标题】:Operator to test for collection membership in Javascript操作员在 Javascript 中测试集合成员资格
【发布时间】:2011-07-11 01:12:11
【问题描述】:

我怎样才能有效地在 Javascript 中进行集合成员资格检查?我有一个可能很大的字符串数组,我需要验证给定的字符串是否是数组的成员。

最初我认为in 运算符可以提供帮助,但在阅读了 Mozilla 开发者网络上的文档后,我发现它的用途 is different。在 Javascript 中,它检查指定的属性是否在指定的对象中。

出于与性能相关的原因,我更喜欢使用 js 内置函数,但如果不存在这样的函数,我可能会结束执行以下操作之一:

  1. 使用数组创建一个以数组元素为键的对象,然后使用in
  2. 遍历数组元素并逐项进行比较
  3. 实现二分查找

有什么意见吗?还是更好的想法?

谢谢

【问题讨论】:

标签: javascript collections comparison membership in-operator


【解决方案1】:

我建议您同时使用对象和数组。

这样,您可以非常快速地对对象进行成员资格测试,并在需要您的项目保持排序时使用该数组。

这是我发现模拟“排序字典”类型行为的唯一方法。

【讨论】:

    【解决方案2】:

    这是否有足够好的性能?

    var inArray = function(array, value) {
        var i = array.length;
    
        while (i--) {
            if (array[i] == value) {
                return true;
            }
        }
    
        return false;
    
    }
    

    jsFiddle.

    除非您的应用程序需要它(测量并查看这是否是瓶颈),否则它应该足够快且足够直接以供阅读。

    【讨论】:

      【解决方案3】:

      你必须使用数组吗?你可以从一开始就使用一个对象吗?如果需要遍历元素,可以在对象上使用 for in 循环。

      二分查找仅在排序后才有效。如果您知道要多次搜索数组,这可能是一个好主意。否则选项 2 会更快。

      【讨论】:

      • 如果我有一个对象,我会使用in(我不必重复)。感谢您提醒我二进制搜索需要排序的数据结构。
      【解决方案4】:

      正如您在this 问题中所发现的那样,几乎每个框架都有相应的功能,一些浏览器甚至原生实现了indexOf 功能(但并非全部)。

      似乎他们都通过迭代数组来做到这一点,有些使用另一个方向(从末端开始),因为它似乎更快。对于亚线性算法,您可能需要实现某种散列集,对键进行二分搜索。

      可以在 here 找到 HashSet 实现的示例。

      【讨论】:

      • 我不能使用 indexOf 因为我也需要支持 IE(所有版本)!我会仔细查看您提供的链接,谢谢。
      猜你喜欢
      • 2021-10-10
      • 2012-11-28
      • 2012-03-02
      • 1970-01-01
      • 2015-09-12
      • 2011-07-10
      • 1970-01-01
      • 1970-01-01
      • 2013-09-29
      相关资源
      最近更新 更多