2009-03-29 1 views
21

В ActionScript 3 есть ли удобный способ определения, имеет ли ассоциативный массив (словарь) конкретный ключ?Как определить, имеет ли ассоциативный массив ключ?

Мне нужно выполнить дополнительную логику, если ключ отсутствует. Я мог поймать исключение undefined property, но я надеюсь, что это может быть моим последним средством.

ответ

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

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

Попробуйте этот оператор: "в"

+0

Спасибо Хлопок, я даже не знал, что оператор существует за пределами каждого цикла. –

+8

это делает меня счастливым, его очень Pythonic. – Soviut

+0

Является лучшим решением от представления производительности? – Rihards

1

Попробуйте это:

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

Не забудьте использовать === вместо ==, подумайте, что вы можете получить ложный удар другим способом. –

4

Самый быстрый способ может быть самым простым:

// 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

Но это работает, если у вас нет ссылки на исходный объект? Ответ на хлопок, кажется, лучше подходит здесь. –

+0

Эй, в вашем вопросе вы упоминаете словари, а не объекты или массивы, правильно? До сих пор я не пробовал использовать оператор «in» в экземпляре «Словарь». LMK –

5

hasOwnPropery это один из способов вы проверить для Это. Возьмите это, например:


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 кажется популярным решением, но стоит отметить, что она имеет дело только в строках и могут быть дорогими, чтобы позвонить.

Если вы используете объекты в качестве ключей в вашем словаре, hasOwnProperty не будет работать.

Более надежное и эффективное решение заключается в использовании строгого равенства для проверки на неопределенный.

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

Не забывайте использовать строгое равенство в противном случае записи с нулевым значением, но правильный ключ будет выглядеть пустым IE

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

И на самом деле, как уже было упомянуто, используя in должно работать слишком

function exists(key:*):Boolean { 
    return key in dictionary; 
} 
Смежные вопросы