Beta, como Goooogle
22 ene
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.
11 Responses for "En JavaScript los arrays asociativos no existen"
¿ Y como se hace un bucle en un array javascript , si no se puede determinar su longitud ?
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
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]);
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.
Vean este ejemplo http://www.syntaxerror.es/2006/12/19/arrays-en-javascript-indice-numerico-vs-asociativos/
En el artículo básicamente se llega a la misma conclusión, en JavaScript no hay arrays asociativos.
Gracias por la explicación!
Eres un verdadero Crack. Felicidades.
lo que dice Ricardo Stuven a mi me funciono. No se podran definir o lo que sea pero los arreglos asociativos en javascript a mi me funcionan muy bien.
Madre mía cómo se lía la peña!!!
Claro que existen los Arrays asociativos, se declaran así:
var MiArrayAsociativo={
PrimeraClave: ValorParaPrimeraClave,
SegundaClave: ValorParaSegundaClave,
…etc…
}
Si con llaves, no con corchetes.
Para saber si una clave existe o no basta con:
var ExisteLaClave_X=X in MiArrayAsociativo;
Para acceder basta con:
var ElValor=MiArrayAsociativo[LaClave];
Y para saber cuantos elementos hay basta con:
var CantidadDeElementos=MiArrayAsociativo.length;
Ahora pongo ejemplos con datos:
var OpcionesValidas={
2:’NombreApellidos’,
“ES”:’España,
true:192
}
if(2 in OpcionesValidas){
alert ‘La clave 2 tiene valor: ‘+OpcionesValidas[2];
}
if(‘ES’ in OpcionesValidas){
alert ‘La clave “ES” tiene valor: ‘+OpcionesValidas["ES"];
}
if(true in OpcionesValidas){
alert ‘La clave true tiene valor: ‘+OpcionesValidas[true];
}
if(!(‘AlgoQueNoEsta’ in OpcionesValidas)){
alert ‘La clave AlgoQueNoEsta no está’;
}
alert(‘Cantidad de claves: ‘+OpcionesValidas.length);
Espero os ayude, es muy útil para buscar un valor en una lista de valores con el truco siguiente…
var ListaValoresValidos={Valor1:0;Valor2:0; .etc. };
if(ElValorBuscado in ListaValoresValidos){
// Existe
}else{
// No existe
}
Así se manejan los arrays asocativos en Javascript.
OJO: No confundir con Arrays normales, esos otro se declaran con new Array(), etc… no son lo mismo
Otro que no ha leído el artículo
No, no existen, lo que estás usando en el ejemplo es un Objeto genérico de JavaScript, no es un array asociativo.
Prueba la propiedad “length”, verás que no funciona porque es un objeto.
Lo que estás definiendo ahí es un objeto con varias propiedades y cada propiedad un valor. Su funcionamiento es similar al de un array asociativo, sí, pero no es un array asociativo, es un objeto con sus propiedades.
Leave a reply