2009-10-13 41 views
10

Flash implementa un diccionario (es decir, algo así como un HashMap) utilizando dos enfoques. Un enfoque es la clase flash.utils.Dictionary, y el otro es un genérico Object. Me gustaría comprobar cuántos pares de key:value están en el diccionario. En la mayoría de los casos, me gustaría simplemente saber que hay cualquierkey:value pares, es decir, simplemente verifique si está vacío.AS3: compruebe si un diccionario está vacío

La documentación no ha sido de mucha ayuda en este punto. ¿Hay una manera simple y clara de hacer esto? En su defecto, ¿hay alguna manera fea pero no demasiado frágil de hacer esto?

Respuesta

6

La única forma en que viene a la mente es para recorrer todas las llaves y contarlos - de este modo:

var count:int = 0; 

for (var key:Object in dict) 
{ 
    count++; 
} 

cojos Bastante - pero creo que eso es lo que les queda. Tenga en cuenta que el diccionario es simplemente una envoltura realmente muy delgada para el objeto vainilla.

12

Esto le dirá de forma fiable si un diccionario particular, está vacía:

function isEmptyDictionary(dict:Dictionary):Boolean 
{ 
    for each(var obj:Object in dict) 
    { 
     if(obj != null) 
     { 
      return false 
     } 
    } 
    return true; 
} 

Tenga en cuenta que lo que necesita hacer el check obj != null - incluso si se establece myDictionary[key] = null, todavía se repetirá como un objeto nulo, por lo que una el bucle for...in normal no funcionará en esa instancia. (Si siempre está usando delete myDictionary[key], debería estar bien).

+4

Parece una solución para las malas prácticas. Eliminar una entrada del diccionario debería eliminar tanto la clave como el valor. Si por alguna razón, quiero eliminar el valor pero dejo la clave, entonces el dict no está realmente vacío, tiene algunas claves (aparentemente significativas) en él. –

+0

Bastante justo. Si elimina la declaración (obj! = Null), entonces esto funcionará, pero supongo que la otra respuesta también funcionará ... – Reuben

+2

En realidad, ¿no sería mejor combinar el enfoque anterior que se usa para ... con este? El enfoque para ... le indica si tiene alguna clave, lo cual es importante. Este enfoque puede fallar si tiene una clave con un valor nulo. – scriptocalypse

1

Otro enfoque es agregar una entrada de diccionario dict ["count"] que se repite cada vez que agrega un elemento al diccionario y se repite cada vez que elimina un elemento. O una solución más sofisticada sería subclasificar el diccionario y agregar propiedades push, pop y length que básicamente hacen lo mismo.

2

Y el caso especial de vacío/no está vacío por parte del OP:

var empty:Boolean = true; 

for (var key:Object in dict) 
{ 
    empty = false; 
    break; 
} 

código como este debe ir en una función de utilidad en vez de duplicar todo el lugar por lo que en el punto de uso será Obvio lo que está pasando.

0

Probado y en funcionamiento.
Claridad mejorada al evitar el lenguaje negativo.

/** 
* @return Whether given Dictionary has content or is empty. 
*/ 
public function hasContent(dictionary:Dictionary):Boolean 
{ 
    for (var anything:Object in dictionary) 
     return true; 
    return false; 
} 
Cuestiones relacionadas