2009-03-29 17 views
21

W języku ActionScript 3 istnieje wygodny sposób określania, czy tablica asocjacyjna (słownik) ma określony klucz?Jak ustalić, czy tablica asocjacyjna ma klucz?

Muszę wykonać dodatkową logikę, jeśli brakuje klucza. Mogę złapać wyjątek undefined property, ale mam nadzieję, że to może być moja ostatnia deska ratunku.

Odpowiedz

37
var card:Object = {name:"Tom"}; 

trace("age" in card); // return false 
trace("name" in card); // return true 

Spróbuj operatora: "w"

+0

Dzięki Cotton, nigdy nie wiedziałem, że operator istnieje poza pętlą. –

+8

to mnie uszczęśliwia, jest bardzo Pythonic. – Soviut

+0

Czy to najlepsze rozwiązanie z widoku wydajności? – Rihards

1

Spróbuj tego:

for (var key in myArray) { 
    if (key == myKey) trace(myKey+' found. has value: '+myArray['key']); 
} 
+0

Pamiętaj, aby użyć === zamiast ==, myśl, że możesz uzyskać fałszywe trafienie w drugą stronę. –

4

Najszybszym sposobem może być najprostsza:

// creates 2 instances 
var obj1:Object = new Object(); 
var obj2:Object = new Object(); 

// creates the dictionary 
var dict:Dictionary = new Dictionary(); 

// adding the first object to the dictionary (but not the second one) 
dict[obj1] = "added"; 

// checks whether the keys exist 
var test1:Boolean = (dict[obj1] != undefined); 
var test2:Boolean = (dict[obj2] != undefined); 

// outputs the result 
trace(test1,test2); 
+1

Ale czy to działa, jeśli nie masz odniesienia do oryginalnego obiektu? Odpowiedź Cottons wydaje się lepiej tu pasuje. –

+0

Hej, w swoim pytaniu wymieniasz słowniki, a nie obiekty lub tablice, czy mam rację? Nie wypróbowałem do tej pory operatora "in" w instancji Dictionary, powinno być w porządku. LMK –

5

hasOwnPropery to jeden ze sposobów na sprawdzenie to. Weź to na przykład:


var dict: Dictionary = new Dictionary(); 

// this will be false because "foo" doesn't exist 
trace(dict.hasOwnProperty("foo")); 

// add foo 
dict["foo"] = "bar"; 

// now this will be true because "foo" does exist 
trace(dict.hasOwnProperty("foo")); 
2

hasOwnProperty wydaje się być popularnym rozwiązaniem, ale warto zwrócić uwagę, że dotyczy on wyłącznie w ciągach znaków i może być drogie, aby zadzwonić.

Jeśli używasz obiektów jako kluczy w Słowniku hasOwnProperty nie będzie działać.

Bardziej niezawodnym i wydajnym rozwiązaniem jest użycie ścisłej równości do sprawdzenia niezdefiniowanej.

function exists(key:*):Boolean { 
    return dictionary[key] !== undefined; 
} 

Pamiętaj, aby używać ścisłej równości inaczej wpisy z wartością null, ale ważnym kluczem będzie wyglądać pusty IE

null == undefined // true 
null === undefined // false 

I rzeczywiście, jak już wspomniano przy użyciu in powinno zadziałać zbyt

function exists(key:*):Boolean { 
    return key in dictionary; 
} 
Powiązane problemy