2012-04-22 3 views
7

Ho il seguente pezzo di codice per la copia di un array associativo ad altri,Copia array associativo in 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> 

Ma il secondo avviso dice "indefinito" .. Sto facendo qualcosa di sbagliato qui? Qualsiasi puntatore per favore ..

+5

Non ci sono array associativi in ​​javascript. – Niko

+6

Gli array JavaScript non funzionano con chiavi non numeriche. Ecco perché '.slice' non li raccoglie. Usate invece un oggetto semplice e poi guardate [Qual è il modo più efficace per clonare un oggetto JavaScript?] (Http://stackoverflow.com/questions/122102/questo-è-il-molto-efficiente-modello-to- clonare-a-javascript-oggetto). –

+1

@Niko: gli array sono oggetti dall'inizio ... non sono "trasformati". –

risposta

17

In JavaScript gli array associativi sono chiamati oggetti.

<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> 

Io normalmente utilizzare var copy_db = $.extend({}, some_db); se stavo usando jQuery.

Fiddle Dimostrazione:http://jsfiddle.net/RNF5T/

Grazie @maja.

+2

Questo non sta creando una copia ... –

+0

@FelixKling Grazie duh. Fisso. – iambriansreed

+0

Si noti che la funzione non copia gli oggetti figlio – maja

4

Come dice @Niko nel commento, non ci sono array associativi in ​​JavaScript.

In effetti si stanno impostando le proprietà sull'oggetto array, che non è una buona idea. Faresti meglio a usare un oggetto reale.

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 ]; 
    } 
} 

Molte librerie implementano una funzione extend che fa esattamente questo (i tasti di copia da un oggetto all'altro). In particolare jQuery e underscore.js. Underscore ha anche _.clone(obj) che è effettivamente _.extend({}, obj)

0

underscore.clone (http://underscorejs.org/#clone) potrebbe aiutare. Esegue una copia superficiale dell'oggetto o dell'array del dizionario.

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

copy_db = _.clone(some_db); 
2

se si desidera utilizzare JSON, si può prendere questo 'array associativo' oggetto:

var assArray = {a zero: 0, uno: 1, due: 2, tre: 3, che: 'mai', è: 'vuoi'};

e 'clone' in questo modo:

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

+1

heh, ass array ... – Ogen