2009-10-23 14 views
6

Poniższa w konsoli javascript:Całkowicie podstawowe odniesienie Javascript pytanie

var a = {'foo': []}; 
var b = {}; 

for (var key in a) { 
    b[key] = a[key]; 
} 

a['foo'].push(1); 

console.log(b); 

Wynik:

Object foo=[1]

chcę zrobić kopię przez wartości w B każdej tablicy dla każdego klawisza w za. Czy istnieje prostszy sposób?

+0

Jak można uzyskać „javascript konsola"? – OscarRyz

+0

Oscarowy Firebug wewnątrz przeglądarki Firefox lub przeglądarka internetowa Safari. – Wells

+0

@Oscar: Do działania 'console.log' potrzebujesz funkcji FireBug. –

Odpowiedz

0

Prostszy sposób:

var a = {'foo': []}; 
var b = a; 

a['foo'].push(1); 

console.log(b); 

wyjściowa jest taka sama.

Edit:

var a = {'foo': []}; 
var b = {}; 

for (var key in a) { 
    if (a.hasOwnProperty(key)) { 
     b[key] = []; 
     for (var i = 0; i < a[key].length; i += 1) { 
      b[key][i] = a[key][i]; 
     } 
    } 
} 

a['foo'].push(1); 

console.log(b); 
+0

Anatolij: Nie chcę, żeby b było po prostu odniesieniem do; Chcę, żeby b była unikatową kopią według wartości tablic przechowywanych w tak, że kiedy popchnę do tablic a nie wpłynie to na b. – Wells

+0

Naprawiono. Obecnie wyjście jest obiektem z pustą tablicą. – Anatoliy

+1

Możesz uprościć wszystkie rzeczy z deep-copy za pomocą 'a [key] .slice (0)'. –

4

Można zrobić "klon" funkcję, która tworzy nowy obiekt, w oparciu o oryginalny obiektu constructor, a następnie sklonować że oryginalne właściwości obiektu także jeśli są obiektami:

function clone(obj){ 
    if(typeof(obj) != 'object' && obj != null) 
    return obj; // return the value itself if isn't an object 
       // or null, since typeof null == 'object'; 

    var temp = new obj.constructor(); 

    for(var key in obj) 
     temp[key] = clone(obj[key]); 
    return temp; 
} 


var a = {'foo': []}; 
var b = clone(a); 

a['foo'].push(1); 

console.log(b); // Object foo=[0] 
+0

Przedtem napotkałem ten problem i właśnie to rozwiązałem. +1 – NateDSaint

+1

Prototypowanie łamie to. Po prostu 'Object.prototype.foo = function() {};' utworzy nieskończoną rekursję. –

+0

@ Jonathan: dodano instrukcję if, aby zatrzymać rekursję. – CMS

0

jak ta doda wsparcie dla głęboko kopiowanie tablic w kodzie:

var a = {'foo': []}; 
var b = {}; 

for (var key in a) { 
    if (Object.prototype.toString.call(b[key]) === "[object Array]") { 
     b[key] = a[key].slice(0); 
    } else { 
     b[key] = a[key]; 
    } 
} 

a['foo'].push(1); 

console.log(b); 
Powiązane problemy