我有一組Javascript字符串,我需要編寫一個函數來檢測另一個特定的字符串是否屬於這個組。最快的方式來檢測值是否在Javascript中的一組值中
實現此目的的最快方法是什麼?將這組值放入一個數組,然後編寫一個可以搜索數組的函數是否可行?
我認爲如果我保持值排序並進行二進制搜索,它應該工作得足夠快。還是有其他一些聰明的方式來做到這一點,它可以更快地工作?
我有一組Javascript字符串,我需要編寫一個函數來檢測另一個特定的字符串是否屬於這個組。最快的方式來檢測值是否在Javascript中的一組值中
實現此目的的最快方法是什麼?將這組值放入一個數組,然後編寫一個可以搜索數組的函數是否可行?
我認爲如果我保持值排序並進行二進制搜索,它應該工作得足夠快。還是有其他一些聰明的方式來做到這一點,它可以更快地工作?
使用哈希表,這樣做:
// 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");
}
使用散列表可能是一個更快的選項。
無論您選擇哪種方案,絕對值得您考慮其替代方案。
您可以使用一個對象,像這樣:
// 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引擎實現的速度,但您可以輕鬆地進行一些性能測試,以便與其他變體進行比較。
如果一個值在您的設置中可能出現多次,並且「多頻繁」對您很重要,那麼您還可以使用遞增數來代替我用於示例的布爾值。
取決於有多少值。
如果有幾個值(小於10到50),搜索數組可能沒問題。散列表可能會矯枉過正。
如果你有很多值,哈希表是最好的選擇。它比排序值和執行二分查找所需的工作量更少。
我認爲JS中的所有東西都是散列表,只是0 => firstentry,1 => secondentry不是嗎? – 2008-11-21 09:40:29
@Trull:我懷疑它。數組與Object不同,可能針對性能進行了優化,但它取決於實現。 – PhiLho 2008-11-21 11:51:17
註釋上面提到的哈希解決方案。 實際上{}創建了一個可能導致一些副作用的對象(上面也提到過)。 其中之一是你的「散列」已經預先填充了默認的對象方法。
所以"toString" in setOfValues
將是true
(至少在Firefox中)。 您可以添加其他字符,例如「」到你的字符串來解決這個問題或者使用「prototype」庫提供的Hash對象。
一種可能的方法,如果集合是不可變的,但仍然是一個變量集使用特別有效:
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的存儲中使用乾草堆。
偶然發現,並意識到答案已過時。在這個時代,除了在特殊情況下,你不應該使用哈希表來實現集合。您應該使用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?
我知道這是一個老帖子。但檢測一個值是一組值,我們可以通過陣列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));
這不起作用的本操縱。 setOfValues [x]其中x不在集合中不會評估爲undefined,它會產生錯誤。你想要的是:「setOfValues中的x」來測試成員資格。 – 2008-11-21 09:31:44
它將評估爲未定義。它不會導致錯誤。試試看。 – Tomalak 2008-11-21 10:01:48