2011-07-10 14 views
8

Quiero crear un objeto, a partir de algo como:Javascript: multidimensional objeto

var map = {}; 

Entonces, quiero añadir elementos con esta función:

add = function(integerA, objectB) { 
    map[objectB.type][integerA] = objectB; 
} 

lo tanto, esto es un ejemplo al azar de la estructura del objeto que quiero lograr:

map = { 
    'SomeType' : { 0 : 'obj', 2 : 'obj', 3 : 'obj' }, 
    'OtherType' : { 0 : 'obj', 5 : 'obj' }, 
}; 

Ahora, mi problema. No puedo hacer map[objectB.type][integerA] = objectB; porque map[objectB.type] no está definido. Podría resolver esto marcando si existe map[objectB.type] a través de un enunciado if y crear map[objectB.type] = {}; cuando sea necesario.

De lo contrario, podría precargar todos los tipos de objetos. Sin embargo, preferiría no tener que hacer esto.

Mi pregunta: ¿hay alguna manera de crear el objeto "sobre la marcha" sin tener que verificar si el tipo ya existe cada vez que deseo llamar a la función add o precargar todos los tipos?

Es importante que mi función de agregar sea lo más rápida posible y que el objeto del mapa sea correcto, porque necesito leer y escribir mucho en poco tiempo (es una aplicación de animación/juego).

+1

¿está seguro de que será un problema de rendimiento? si yo fuera tú, lo probaría primero y ver si es un problema. al final del día, o tendrá que hacer el cheque, o el motor de JavaScript, por lo que las instrucciones deberán procesarse igualmente –

+0

este enlace tiene la respuesta para su pregunta http://stackoverflow.com/questions/7744611/pass-variables-by-reference-in-javascript –

Respuesta

9

No, no hay ninguna otra manera de crear objetos sobre la marcha. Solo compruebe la existencia cada vez:

add = function(integerA, objectB) { 
    if (!map[objectB.type]) { 
     map[objectB.type] = {};   
    } 
    map[objectB.type][integerA] = objectB; 
} 

Si desea mejorar el rendimiento, puede considerar algunas técnicas de almacenamiento en caché.

+0

Agradezco todas las respuestas, esta es la más clara. Elegiré precargar los tipos entonces. – user8363

3

Puede usar el acceso directo booleano O (que evita al menos un if explícito). Puede que no sea legible que sin embargo:

var data = map[objectB.type] || (map[objectB.type] = {}); 
data[integerA] = objectB; 

Esto funciona porque una asignación realidad devuelve el valor que le fue asignado y un OR expresión devuelve el primer valor que se evalúa como true.

No creo que el uso de un if tiene ningún impacto en el rendimiento, aunque (en realidad, la forma en que mi respuesta podría ser aún más "lento").

3

Si utiliza el mapa solo para búsquedas y no necesita iterar sobre las dimensiones, puede combinar sus dimensiones en una sola clave. Por ejemplo:

add = function(integerA, objectB) { 
    var key = objectB.type + '-' + integerA; 
    map[key] = objectB; 
} 
Cuestiones relacionadas