运算符在Javascript中测试集合成员资格

时间:2011-03-08 11:29:20

标签: javascript collections comparison membership in-operator

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

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

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

  1. 使用数组创建一个具有数组元素作为键的对象,然后使用in
  2. 遍历数组元素并逐项进行比较
  3. 实施二元搜索
  4. 有什么意见吗?还是更好的想法?

    由于

4 个答案:

答案 0 :(得分:2)

正如你在this问题中发现的那样,几乎每个框架都有一个函数,有些浏览器甚至本身实现了indexOf函数(虽然不是全部)。

似乎他们都通过迭代数组来完成它,有些使用另一个方向(从结尾开始),因为它似乎更快。对于次线性算法,您可能需要在键上实现某种带二进制搜索的哈希集。

可以找到HashSet实现的示例here

答案 1 :(得分:2)

这是否具有足够好的性能?

var inArray = function(array, value) {
    var i = array.length;

    while (i--) {
        if (array[i] == value) {
            return true;
        }
    }

    return false;

}

jsFiddle

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

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

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

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

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