我怎样才能在Javascript中有效地进行集合成员资格检查?我有一个可能很大的字符串数组,我需要验证给定的字符串是否是数组的成员。
最初我认为in
运算符可以提供帮助,但在阅读Mozilla Developer Network上的文档后,我发现了它的目的is different。在Javascript中,它检查指定的属性是否在指定的对象中。
出于与性能相关的原因,我更喜欢使用js内置,但是如果不存在这样的函数,我可能会结束以下操作之一:
in
有什么意见吗?还是更好的想法?
由于
答案 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;
}
除非您的应用程序需要它(测量并查看这是否是瓶颈),否则这应该足够快且足够直接阅读。
答案 2 :(得分:0)
你必须使用数组吗?你能从一开始就使用一个物体吗?如果需要迭代元素,可以在对象上使用for循环。
二进制搜索仅在其排序后才有效。如果您知道要多次搜索数组,这可能是一个好主意。否则选项2会更快。
答案 3 :(得分:0)
我建议您同时使用对象和数组。
这样,您可以非常快速地对对象进行成员资格测试,并在需要对项目进行排序时使用该数组。
这是我发现模仿“排序字典”行为的唯一方法。