2009-03-29 21 views
21

En ActionScript 3, ¿hay alguna forma conveniente de determinar si una matriz asociativa (diccionario) tiene una clave particular?¿Cómo determinar si una matriz asociativa tiene una clave?

Necesito realizar una lógica adicional si falta la clave. Pude ver la excepción undefined property, pero espero que sea mi último recurso.

Respuesta

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

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

probar este operador: "en"

+0

Gracias Cotton, nunca supe que el operador existía fuera de un bucle for-each. –

+8

esto me hace feliz, es muy pitónico. – Soviut

+0

¿Es la mejor solución desde la vista de rendimiento también? – Rihards

1

Prueba esto:

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

Recuerda usar === en lugar de ==, piensa que puedes recibir un falso golpe en el otro sentido. –

4

La forma más rápida puede ser la más simple:

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

¿Pero funciona eso si no tiene referencia al objeto original? La respuesta de Cotton parece ser mejor aquí. –

+0

Oye, en tu pregunta mencionas diccionarios y no objetos o matrices, ¿estoy en lo cierto? No he probado el operador "in" dentro de una instancia de Dictionary hasta ahora, debería estar bien. LMK –

5

hasOwnPropery es una manera de probar para eso. Tome esto, por ejemplo:


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 parece ser la solución popular, pero vale la pena señalar que sólo se ocupa de las cadenas y puede ser costoso llamar.

Si está utilizando objetos como claves en su Diccionario, hasOwnProperty no funcionará.

La solución más confiable y eficaz es utilizar igualdad estricta para comprobar si está indefinido.

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

Recuerde utilizar igualdad estricta de lo contrario las entradas con un valor nulo, pero clave válida se verá es decir, vacío

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

Y, de hecho, como se ha mencionado el uso de in debería funcionar bien también

function exists(key:*):Boolean { 
    return key in dictionary; 
} 
Cuestiones relacionadas