2009-10-13 109 views
10

Flash使用兩種方法實現字典(即類似於HashMap的字典)。一種方法是flash.utils.Dictionary類,另一種是通用的Object。我想查看字典中有多少個key:value對。在大多數情況下,我只想知道它有任何key:value對,即只檢查它是否爲空。AS3:檢查字典是否爲空

這方面的文檔沒有太多的幫助。有沒有簡單明瞭的方法來做到這一點?如果沒有,那麼有沒有一種醜陋但不太脆弱的方式來做到這一點?

回答

6

,想到的唯一辦法是通過所有鍵進行迭代並計數 - 像這樣:

var count:int = 0; 

for (var key:Object in dict) 
{ 
    count++; 
} 

漂亮跛 - 但我認爲那是你還剩下什麼。請注意,Dictionary對於vanilla Object來說只是一個真正非常薄的包裝。

12

這將可靠地告訴你,如果一個特定的字典是空的:

function isEmptyDictionary(dict:Dictionary):Boolean 
{ 
    for each(var obj:Object in dict) 
    { 
     if(obj != null) 
     { 
      return false 
     } 
    } 
    return true; 
} 

請注意,你需要做的obj != null檢查 - 即使你設置myDictionary[key] = null,它仍然會遍歷一個空的對象,所以在這種情況下,常規的for...in循環將不起作用。 (如果你總是使用delete myDictionary[key],你應該沒問題)。

+4

這似乎是一個不良做法的解決方案。從字典中刪除條目應刪除鍵和值。如果由於某種原因,我想刪除這個值,但是離開這個鍵,那麼這個字典就不是真的空 - 它有一些(顯然是有意義的)鍵。 – 2009-10-14 17:32:39

+0

夠公平的。如果你刪除(obj!= null)語句,那麼這將起作用,但我猜測其他答案也會起作用... – Reuben 2009-10-14 20:27:18

+2

其實,最好不要將上述方法結合使用...與這一個? for ... in方法告訴你是否有任何鍵,這很重要。如果您的鍵值爲空,則此方法可能會失敗。 – scriptocalypse 2011-04-19 19:28:34

1

另一種方法是添加一個詞典條目dict [「count」],每次將項目添加到字典時迭代,並在每次刪除項目時進行迭代。或者更復雜的解決方案將繼承Dictionary,並添加push,pop和長度屬性,這些屬性的功能基本相同。

2

而且由OP提到的空/空特例:

var empty:Boolean = true; 

for (var key:Object in dict) 
{ 
    empty = false; 
    break; 
} 

這樣的代碼在一個效用函數應該去複製它所有的地方,而不是因此在使用的時候它會明顯發生了什麼事情。

0

測試和工作。
通過避免負面語言提高了清晰度。

/** 
* @return Whether given Dictionary has content or is empty. 
*/ 
public function hasContent(dictionary:Dictionary):Boolean 
{ 
    for (var anything:Object in dictionary) 
     return true; 
    return false; 
}