Arrays la pata coja de JavaScript

web201 Los que me conocen o que han compartido trabajo conmigo en cuanto a tema de programación son testigos de mi ‘amor’ (irónicamente hablando) hacia javascript. Personalmente que es un lenguaje que se creó para un objetivo muy limitado y que por el auge de la propia web 2.0 e internet se ha ido parcheando cada vez más.

400px-WikiBookTitel_JavaScript En concreto con los arrays, es difícil imaginarse un lenguaje en el que no puedas decir que a=b y que luego si modificas a no te cambie b. O crear arrays asociativos, o insertar en medio de un array un elemento. Pues todo esto son puntos flacos de javascript. Como diría Jack El Destripador ‘vamos por partes’.

Asignar un array a otro

Javascript en el caso de arrays no permite igualar uno a otro, o si lo permite pero ambos son punteros a una misma dirección de memoria, por lo que modificando uno modificas el otro. El caso es declarar ambos arrays por separado y hacer un concat de uno con el otro, para arrays multidimensionales ya no es tan sencillo, te tienes que hacer una función recursiva para hacerlo.

Arrays Asociativos

Esta es la gran cagada de este lenguaje, tu puedes decir que a[‘país’] = España, pero en realidad lo que estas diciendo es que a tiene una propiedad llamada país y que esta es España, o sea a.país = España. El array a no tendrá longitud si no la has definido en el constructor y no tendrá un valor para recorrerlo con la función each de jquery hasta que no digas a[0] = x.

Insertar en el medio de un array

javascript2 Tampoco hay una función para insertar un elemento por ejemplo entre el indice2 y el 3, para ello hay que crear el 4 igualarlo al 3, luego el 3 igualarlo a lo que quieres, y esto ya se complica si dentro hay arrays multidimensionales porque no puedes copiarlos así como así, y se complica más si es asociativo porque no puedes recorrerlo con un for.

En fin aquí os dejo un código para copiar un array multidimensional en otro, ambos con direcciones de memoria distintas:

function copiarArray(origen,copia){
    for(var clave in origen){
        if(typeof origen[clave] == 'object'){
            var elementos = origen[clave].length;
            copia[clave] = new Array(elementos);
            copiarArray(origen[clave],copia[clave]);
        }
        else
            copia[clave] = origen[clave];
    }
}

Comentarios

Anónimo ha dicho que…
Gracias por tu post, me ha servido mucho, te comento mi caso, yo abria un window pop up y pasaba al opener un array funcionaba en todos los navegadores pero en IE solo la primera vez, despues de medio dia de busqueda me di cuenta que no es llegar y hacer a=b y gracias a tu funcion recursiva me a funcionado de maravillas, muchas gracias y sigue adelante te vas a mis favoritos ;)

Manuel.
Reynier ha dicho que…
Muchas gracias Manuel, no veas los dolores de cabeza que me dio a mi esto
dani ha dicho que…
mmm me parece un poco fea esa apreciación de JavaScript.
En mi opinión, Javascript es uno de los lenguajes más flexibles que conozco.
Pienso que en un entorno como el navegador, donde el tiempo de descarga es importante, prima la velocidad y el uso de recursos. El hecho de que al hacer la asignación a = b
de dos arrays, y que se asigne la referencia de b, en lugar de una copia, no supone una restricción importante, y en muchos casos, puede suponer un mejor uso de los recursos.
Un saludo
Reynier ha dicho que…
hola Dani, como toda opinión es algo personal. Yo también opino como tú en que JS es muy flexible pero no por eso niego algunas de sus carencias a mi entender. Para mi induce a error que a = b sea en realidad un puntero, por ejemplo en c o en java la notación a un puntero es distinta. Y los arrays asociativos me parece que de tan flexible se pasa porque para mi a['b'] es una cosa muy pero muy distinta a a.b.
dani ha dicho que…
Jeje, sí, es que a mi me ocurre lo contrario que a ti, y es que me gusta la flexibilidad de Javascript.
Muchas gracias en cualquier caso por el código para clonar, me ayudó mucho.
un saludo.