检测值是否在Javascript中的一组值中的最快方法

时间:2008-11-21 08:34:48

标签: javascript search

我在Javascript中有一组字符串,我需要编写一个函数来检测另一个特定字符串是否属于该组。

实现这一目标的最快方法是什么?是否可以将值组放入数组中,然后编写一个搜索数组的函数?

我认为如果我保持值的排序并进行二分查找,它应该足够快。或者还有其他一些聪明的方法可以更快地运作吗?

9 个答案:

答案 0 :(得分:20)

使用哈希表,并执行以下操作:

// Initialise the set

mySet = {};

// Add to the set

mySet["some string value"] = true;

...

// Test if a value is in the set:

if (testValue in mySet) {
     alert(testValue + " is in the set");
} else {
     alert(testValue + " is not in the set");
}

答案 1 :(得分:8)

您可以使用如下对象:

// prepare a mock-up object
setOfValues = {};
for (var i = 0; i < 100; i++)
  setOfValues["example value " + i] = true;

// check for existence
if (setOfValues["example value 99"]);   // true
if (setOfValues["example value 101"]);  // undefined, essentially: false

这利用了对象作为关联数组实现的事实。速度有多快取决于您的数据和JavaScript引擎实现,但您可以轻松地进行一些性能测试,以便与其他变体进行比较。

如果某个值在您的集合中出现多次并且“多久”对您很重要,您还可以使用递增数字代替我用于示例的布尔值。

答案 2 :(得分:5)

对上述哈希解决方案的评论。 实际上{}会创建一个对象(也在上面提到),这可能会导致一些副作用。 其中之一是您的“哈希”已预先填充了默认对象方法。

所以"toString" in setOfValues将是true(至少在Firefox中)。 您可以添加其他字符,例如“”到你的字符串来解决这个问题或使用“原型”库提供的哈希对象。

答案 3 :(得分:4)

偶然发现了这一点并意识到答案已经过时了。在这个时代,您不应该使用哈希表来实现集合,除非在极端情况下。您应该使用sets

例如:

> let set = new Set();
> set.add('red')

> set.has('red')
true
> set.delete('red')
true
> set.has('red')
false

有关更多示例和讨论,请参阅此SO帖子:Ways to create a Set in JavaScript?

答案 4 :(得分:2)

一种可能的方法,如果集合是不可变的,特别有效,但仍可用于变量集:

var haystack = "monday tuesday wednesday thursday friday saturday sunday";
var needle = "Friday";
if (haystack.indexOf(needle.toLowerCase()) >= 0) alert("Found!");

当然,您可能需要更改分隔符,具体取决于您必须放置的字符串...

一个更强大的变体可以包括界限,以确保“day wed”和“day”都不能正面匹配:

var haystack = "!monday!tuesday!wednesday!thursday!friday!saturday!sunday!";
var needle = "Friday";
if (haystack.indexOf('!' + needle.toLowerCase() + '!') >= 0) alert("Found!");

如果输入是肯定的,则可能不需要(例如,数据库外等)。

我在Greasemonkey脚本中使用它,其优点是直接在GM的存储中使用haystack。

答案 5 :(得分:0)

使用哈希表可能是一个更快的选择。

无论您选择什么样的选项,都绝对值得测试其性能与您考虑的替代方案。

答案 6 :(得分:0)

取决于有多少价值。

如果有一些值(小于10到50),搜索数组可能没问题。哈希表可能有点过分。

如果您有很多值,则哈希表是最佳选择。与排序值和进行二分查找相比,它所需的工作量更少。

答案 7 :(得分:0)

我知道这是一个老帖子。但是为了检测值是否在一组值中,我们可以通过数组indexOf()进行操作,该数组搜索并检测值的当前值

var myString="this is my large string set";
var myStr=myString.split(' ');
console.log('myStr contains "my" = '+ (myStr.indexOf('my')>=0));
console.log('myStr contains "your" = '+ (myStr.indexOf('your')>=0));

console.log('integer example : [1, 2, 5, 3] contains 5 = '+ ([1, 2, 5, 3].indexOf(5)>=0));

答案 8 :(得分:0)

您可以使用ES6 includes

var string = "The quick brown fox jumps over the lazy dog.",
  substring = "lazy dog";

console.log(string.includes(substring));