En JavaScript los arrays asociativos no existen
22 Enero, 2007
Sí, es cierto, lo acabo de descubrir, y luego explicaré los detalles, pero antes quiero contar qué es lo que me ha llevado a afirmar esto.
La semana pasada me tocó analizar junto a un compañero un código JavaScript que no funcionaba correctamente, utilizaba arrays asociativos para almacenar distintas categorías, por ejemplo:
var paises = new Array();
paises['es'] = ‘España’;
paises['pt'] = ‘Portugal’;
paises['us'] = ‘Estados Unidos’;
paises['uk'] = ‘Reino Unido’;
Hasta aquí, todo parece normal, es un array asociativo, como clave guardo el código del país y como valor el nombre, igual que lo haría en PHP por ejemplo. Pero luego, al intentar ordenarlo con opciones.sort(); que supuestamente ordena el array, no funcionaba, ni siquiera pasándole como parámetro una función personalizada para la ordenación (Especificación del método sort)
Supusimos que el método sort() no soportaba arrays asociativos e implementamos la solución utilizando arrays normales y corrientes, con claves numéricas, a la vez que nos preguntábamos cómo podía ser que JavaScript tuviese esa falta tan grave.
Hoy me disponía a comentar este error y buscar una nueva implementación de sort que soportara arrays asociativos (o incluso hacerla yo mismo si no hubiese encontrado ninguna) cuando sin quererlo me he encontrado con que JavaScript no tiene arrays asociativos, no existen. Entonces, ¿Cómo es que el ejemplo anterior funciona? (Sin contar el método sort)
Funciona porque lo que estamos haciendo es añadirle propiedades al objeto de tipo Array. En JavaScript, cuando hacemos variable['nombre'] lo que ocurre es que añadimos una nueva propiedad con el nombre “nombre” al objeto “variable”. Por eso, si hacemos:
var paises = new Array();
paises['es'] = ‘España’;
paises['pt'] = ‘Portugal’;
paises['us'] = ‘Estados Unidos’;
paises['uk'] = ‘Reino Unido’;
alert(paises.length);
Si existiesen los arrays asociativos debería aparecer una ventanita con un 4 ¿verdad? Pues como no existen, sale un 0, porque no le estamos añadiendo valores al array, si no propiedades al objeto.
Otros hechos que hacen sospechar de que JavaScript no tiene soporte para arrays asociativos es que no hay forma de definir un array asociativo ni con el constructor del objeto Array ni con la sintaxis para crear un array de forma literal.
Me he sorprendido mucho al leer esto en http://www.andrewdupont.net/2006/05/18/javascript-associative-arrays-considered-harmful/ , pues llevo años viendo como en muchos tutoriales explican equívocamente cómo utilizar arrays asociativos en JavaScript, tal y como yo lo he hecho.
22 Enero, 2007 a las 7:51 pm
¿ Y como se hace un bucle en un array javascript , si no se puede determinar su longitud ?
22 Enero, 2007 a las 7:55 pm
Lo que ocurre es que lo que estoy mostrando en los ejemplos no es un array, es una manera errónea de intentar crear un array asociativo.
Un array válido en JavaScript sería:
var paises = new Array();
paises[0] = new Array(’es’,'España’);
paises[1] = new Array(’pt’,'Portugal’);
alert(paises.length);
En este caso sí que devuelve 2, porque es un array con claves numéricas, como debe ser en JavaScript y en este caso sí puedes recorrer el array con un típico for(var i=0;i
22 Enero, 2007 a las 10:51 pm
Aparentemente, tienes razón. Pero sí existe la sintaxis literal:
var paises = {’es’:'España’, ‘pt’:'Portugal’};
Y por otro lado, puedes hacer un bucle por las llaves:
for (var llave in paises)
alert(llave + ‘:’ + paises[llave]);
22 Enero, 2007 a las 11:37 pm
Esa es la sintaxis para definir objetos.
var paises = {’es’:'España’, ‘pt’:'Portugal’};
alert(typeof(paises));
Verás que es un “object” y si además pruebas:
paises.length;
Verás que pone undefined.
Es un objeto, no un array. No hay ninguna sintaxis para definir arrays asociativos porque estos no existen en JavaScript.
13 Diciembre, 2007 a las 3:30 pm
Vean este ejemplo http://www.syntaxerror.es/2006/12/19/arrays-en-javascript-indice-numerico-vs-asociativos/
14 Diciembre, 2007 a las 10:26 pm
En el artículo básicamente se llega a la misma conclusión, en JavaScript no hay arrays asociativos.