Как определить, есть ли у ассоциативного массива ключ? - PullRequest
21 голосов
/ 29 марта 2009

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

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

Ответы [ 5 ]

37 голосов
/ 31 марта 2009
var card:Object = {name:"Tom"};

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

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

5 голосов
/ 11 апреля 2009

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"));
4 голосов
/ 30 марта 2009

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

// 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);
2 голосов
/ 09 апреля 2013

hasOwnProperty, похоже, является популярным решением, но стоит отметить, что он работает только со строками и может быть дорогим для вызова.

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

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

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

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

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

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

function exists(key:*):Boolean {
    return key in dictionary;
}
1 голос
/ 29 марта 2009

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

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