2008-11-21 26 views
10

我有一組Javascript字符串,我需要編寫一個函數來檢測另一個特定的字符串是否屬於這個組。最快的方式來檢測值是否在Javascript中的一組值中

實現此目的的最快方法是什麼?將這組值放入一個數組,然後編寫一個可以搜索數組的函數是否可行?

我認爲如果我保持值排序並進行二進制搜索,它應該工作得足夠快。還是有其他一些聰明的方式來做到這一點,它可以更快地工作?

回答

16

使用哈希表,這樣做:

// 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"); 
} 
0

使用散列表可能是一個更快的選項。

無論您選擇哪種方案,絕對值得您考慮其替代方案。

7

您可以使用一個對象,像這樣:

// 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引擎實現的速度,但您可以輕鬆地進行一些性能測試,以便與其他變體進行比較。

如果一個值在您的設置中可能出現多次,並且「多頻繁」對您很重要,那麼您還可以使用遞增數來代替我用於示例的布爾值。

+0

這不起作用的本操縱。 setOfValues [x]其中x不在集合中不會評估爲undefined,它會產生錯誤。你想要的是:「setOfValues中的x」來測試成員資格。 – 2008-11-21 09:31:44

+0

它將評估爲未定義。它不會導致錯誤。試試看。 – Tomalak 2008-11-21 10:01:48

0

取決於有多少值。

如果有幾個值(小於10到50),搜索數組可能沒問題。散列表可能會矯枉過正。

如果你有很多值,哈希表是最好的選擇。它比排序值和執行二分查找所需的工作量更少。

+0

我認爲JS中的所有東西都是散列表,只是0 => firstentry,1 => secondentry不是嗎? – 2008-11-21 09:40:29

+0

@Trull:我懷疑它。數組與Object不同,可能針對性能進行了優化,但它取決於實現。 – PhiLho 2008-11-21 11:51:17

5

註釋上面提到的哈希解決方案。 實際上{}創建了一個可能導致一些副作用的對象(上面也提到過)。 其中之一是你的「散列」已經預先填充了默認的對象方法。

所以"toString" in setOfValues將是true(至少在Firefox中)。 您可以添加其他字符,例如「」到你的字符串來解決這個問題或者使用「prototype」庫提供的Hash對象。

2

一種可能的方法,如果集合是不可變的,但仍然是一個變量集使用特別有效:

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

當然,你可能需要根據你必須把字符串來改變分離器有...

更健壯的變體可以包括範圍,以確保既不是「天結婚」也不是「天」能積極配合:

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

可能是不如果輸入是確定的(如。數據庫外等)。

我在Greasemonkey腳本中使用了這個功能,其優點是可以直接從GM的存儲中使用乾草堆。

3

偶然發現,並意識到答案已過時。在這個時代,除了在特殊情況下,你不應該使用哈希表來實現集合。您應該使用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?

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));

相關問題