2012-03-28 49 views
1

我想使用散列表作爲圖形庫的某些對象的集合,以便我可以通過說出諸如set.remove(v2)之類的內容來快速刪除這些對象。Javascript:訪問Hashtable的鍵的屬性

但是,我似乎無法使用這些對象,但我嘗試迭代該集合,因爲這些鍵沒有正確的屬性,即使==顯示它們是相同的對象!

我能做些什麼來迭代設置和使用屬性或功能是鍵的一部分?

測試用例如下所示,結果相當出乎意料(對我來說)!

v1={'a':2,'b':3}; 
set={}; 
set[v1]=true; 

// Access the object within set 
var v2; for(var k in set) v2=k; 

// At this moment, v2 and v1 should be the same object, but... 

console.log(v2==v1); // returns true 
console.log(JSON.stringify(v1)); // returns {"a":2,"b":3} 
console.log(JSON.stringify(v2)); // returns "[object Object]" !!! 
console.log(v1.a); // returns 2 
console.log(v2.a); // causes error 'reference to undefined property v2.a' !!! 
+2

首先,總是使用'==='覆蓋'=='來避免類型轉換給你一個誤報。如果你運行'console.log(v2 === v1)',你會發現它們實際上不是同一個對象。 – MrMisterMan 2012-03-28 08:56:04

回答

1

您試圖設置一個對象作爲另一個對象的鍵,這在當前的ECMAScript實現中是不可能的。當您撥打set[v1]=true;時,引擎內部將v1轉換爲字符串,結果爲"[object Object]",但沒有可識別的屬性。

ECMAScript 6允許您使用WeakMap將對象映射到其他值,但該API仍處於早期階段,目前僅在Chrome中提供 - 具有命令行開關和Firefox。

+0

謝謝!有沒有其他方法可以維護O(1)搜索或刪除的對象列表? – KalEl 2012-03-28 09:11:07

+0

嘗試類似'set [「obj1」] = v1;' – Epuri 2012-03-28 09:14:45

+0

@KalEl:除非您只能使用ES5實現(大部分較新的瀏覽器),否則不能與鍵對象一起使用。爲此,有一個[WeakMap shim](https://gist.github.com/1638059)即O(1)用於搜索和刪除。 – 2012-03-28 09:43:35