2009-03-29 6 views
21

In ActionScript 3, esiste un modo conveniente per determinare se un array associativo (dizionario) ha una chiave particolare?Come determinare se un array associativo ha una chiave?

Devo eseguire una logica aggiuntiva se manca la chiave. Potrei prendere l'eccezione undefined property, ma spero che possa essere la mia ultima risorsa.

risposta

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

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

Prova questo operatore: "in"

+0

Grazie Cotton, non ho mai nemmeno saputo che quell'operatore esistesse al di fuori di un ciclo for-each. –

+8

questo mi rende felice, è molto Pythonic. – Soviut

+0

È la soluzione migliore anche dalla visualizzazione prestazioni? – Rihards

1

Prova questo:

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

Ricorda di usare === invece di ==, pensa che potresti ottenere un falso in un altro modo. –

4

Il modo più veloce può essere la più semplice:

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

Ma funziona se non si ha alcun riferimento all'oggetto originale? La risposta dei cotoni sembra adattarsi meglio qui. –

+0

Ehi, nella tua domanda stai citando Dizionari e non Oggetti o Array, vero? Non ho ancora provato l'operatore "in" all'interno di un'istanza Dictionary, dovrebbe essere ok. LMK –

5

hasOwnPropery è un modo di testare per esso. Prendete questo esempio:


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 sembra essere la soluzione popolare, ma vale la pena sottolineare che si tratta solo nelle stringhe e può essere costoso per chiamare.

Se stai usando oggetti come chiavi nel tuo dizionario hasOwnProperty non funzionerà.

La soluzione più affidabile e performante consiste nell'utilizzare l'uguaglianza rigorosa per verificare l'indefinito.

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

Ricordate di usare uguaglianza rigorosa altrimenti le voci con un valore nullo, ma chiave valida guarderà cioè vuoto

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

E in realtà, come è stato detto con in dovrebbe funzionare bene anche

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