2012-04-22 22 views
7

he el siguiente fragmento de código para copiar una matriz asociativa a otra,¿Copiar matriz asociativa en javascript?

<script> 

var some_db = new Array(); 

some_db["One"] = "1"; 

some_db["Two"] = "2"; 

some_db["Three"] = "3"; 

var copy_db = new Array(); 

alert(some_db["One"]); 

copy_db = some_db.slice(); 

alert(copy_db["One"]); 


</script> 

Pero la segunda alerta dice "indefinido" .. Estoy haciendo algo mal aquí? Cualquier apuntador, por favor ..

+5

No hay matrices asociativas en javascript. – Niko

+6

Las matrices JavaScript no funcionan con claves no numéricas. Es por eso que '.slice' no los recoge. Use un objeto simple en su lugar y luego observe [¿Cuál es la forma más eficiente de clonar un objeto JavaScript?] (Http://stackoverflow.com/questions/122102/what-is-the-most-efficient-way-to- clone-a-javascript-object). –

+1

@Niko: las matrices son objetos desde el principio ... no se "giran". –

Respuesta

17

En las matrices asociativas de JavaScript se llaman objetos.

<script> 

var some_db = {   
    "One" : "1",  
    "Two" : "2",  
    "Three" : "3"  
}; 

var copy_db = clone(some_db); 

alert(some_db["One"]); 

alert(copy_db["One"]);  

function clone(obj) { 
    if (null == obj || "object" != typeof obj) return obj; 
    var copy = obj.constructor(); 
    for (var attr in obj) { 
     if (obj.hasOwnProperty(attr)) copy[attr] = clone(obj[attr]); 
    } 
    return copy; 
} 

</script> 

que normalmente usa var copy_db = $.extend({}, some_db); si yo estaba usando jQuery.

violín Prueba:http://jsfiddle.net/RNF5T/

Gracias @maja.

+2

Esto no está creando una copia ... –

+0

@FelixKling Gracias duh. Fijo. – iambriansreed

+0

Observe que la función no copia los objetos secundarios – maja

4

Como @Niko dice en el comentario, no hay matrices asociativas en JavaScript.

En realidad está configurando propiedades en el objeto de matriz, lo cual no es una muy buena idea. Sería mejor usar un objeto real.

var some_db = {}; 
some_db["One"] = "1"; 
some_db["Two"] = "2"; 
some_db["Three"] = "3"; 

var copy_db = {}, prop; 
// loop over all the keys in the object 
for (prop in some_db) { 
    // make sure the object has this value, and not its prototype 
    if (some_db.hasOwnProperty(prop)) { 
    copy_db[ prop ] = some_db[ prop ]; 
    } 
} 

Muchas bibliotecas implementan una función extend que hace exactamente esto (botones de copia de un objeto a otro). Más notablemente jQuery y underscore.js. Underscore también tiene _.clone(obj) que es efectivamente _.extend({}, obj)

0

underscore.clone (http://underscorejs.org/#clone) podría ayudar. Realiza una copia superficial al objeto o matriz del diccionario.

var some_db = {   
    "One" : "1",  
    "Two" : "2",  
    "Three" : "3"  
}; 

copy_db = _.clone(some_db); 
2

si desea utilizar JSON, se puede tomar esta 'matriz asociativa' objeto:

var assArray = {cero: 0, uno: 1, dos: 2, tres: 3, lo que: 'alguna vez', tú: 'quieres'};

y 'clon' de esta manera:

var clonedObj = JSON.parse (JSON.stringify (assArray));

+1

heh, arreglo de culo ... – Ogen

Cuestiones relacionadas