2013-02-17 52 views
1

我有一個非常大的硬編碼索引數組,我想輕鬆地轉換爲關聯數組,所以查找速度更快。定義關聯數組沒有值

var arr = ["a", "b", "c"]; 

現在我正在通過arr循環並將其值與值進行比較以查看是否存在匹配。現在我有數百個元素,它變得相當慢,並且有一個關聯數組會更快。

看來我不能只是做

var arr = {"a", "b", "c"}; 

我真的不能添加值,因爲實在是太慢了。

當然,我可以將元素複製到關聯數組或對數組進行排序並進行二分搜索,但只要能夠爲數組元素指定默認值並使用上述語法就會容易得多。

我猜這是不可能的,但?

+0

向對象屬性添加值與速度有什麼關係? – 2013-02-17 05:03:19

+0

@thesystem如果使用散列查找,它可以散列該鍵以找到它所在的存儲桶,這應該減少查找空間。 – alex 2013-02-17 05:04:03

+0

@alex:不,我指的是這樣的:*「我不能真正添加​​一個值,因爲它太慢了。」* – 2013-02-17 05:06:18

回答

1
var mapLookup = arr.reduce(function (accumalator, value) { 
    accumalator[value] = true; 
    return accumalator; 
}, {}); 
+0

IE 8不支持縮小,它仍然相當普遍 – lmortenson 2013-02-17 05:12:02

1

何不: VAR ARR = { 「一」:1, 「B」:1, 「C」:1};

+0

,因爲我不得不添加':1'到大約1000+個元素以及手動添加到數組中的每個元素。 – jsmdnq 2013-02-17 05:10:02

1

大多數現代瀏覽器支持Array.indexOf()。如果您的搜索沒有結果,這將返回-1

您確實遇到速度問題,或者您只是預優化?你應該使用的容器是一個數組。你有一組元素 - 它們不與任何其他值相關聯,所以爲什麼把它們放在地圖容器中?

此外,它聽起來像你想要一個set,其中你有一個獨特的元素集。

+0

OP想要與值進行比較,而不是a,b,c鍵。 – ATOzTOA 2013-02-17 05:06:54

+0

有沒有值.. – Aesthete 2013-02-17 05:07:42

+0

是的,我的壞... – ATOzTOA 2013-02-17 05:08:49

1

轉換陣列關聯數組似乎是最簡單,速度非常快:

var arr = ["a", "b", "c"]; 
var arrA = {}; for(var i = 0; i < arr.length; i++) arrA[arr[i]] = 0; 

就用key in arrA爲O(1)查找。 (這將是更容易有沒有明確提供一個值的關鍵,但能力....)

本質

if (key in arrA) ... 

取代

for(var i = 0; i < arr.length; i++) if (key == arr[i]) ... 

基本上是O( n)與O(n^2)在循環內使用時相比。

+0

如果你真的想縮短它,你可以做'eval(「({」+ arr.join(「:1,」)+「:1})」)' – 2013-02-17 05:18:36