2009-10-23 26 views
6

Sau đây trong một bảng điều khiển Javascript:Hoàn toàn cơ bản javascript tài liệu tham khảo câu hỏi

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

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

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

console.log(b); 

Sản lượng:

Object foo=[1]

Tôi muốn tạo một bản sao của giá trị trong b của mỗi mảng cho mỗi chủ chốt trong a. Có cách nào dễ hơn không?

+0

Làm thế nào để bạn có được một "javascript console "? – OscarRyz

+0

Oscar- sử dụng Firebug bên trong Firefox hoặc Trình kiểm tra web của Safari. – Wells

+0

@Oscar: Bạn cần FireBug cho chức năng 'console.log' để hoạt động. –

Trả lời

0

cách dễ dàng hơn:

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

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

console.log(b); 

Output là như nhau.

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

Anatoliy: Tôi không muốn b chỉ đơn giản là một tham chiếu đến một; Tôi muốn b là một bản sao duy nhất bởi giá trị của các mảng được lưu trữ trong một khi tôi đẩy vào mảng của nó, nó không ảnh hưởng đến b. – Wells

+0

Đã sửa lỗi. Hiện tại đầu ra là đối tượng với mảng trống. – Anatoliy

+1

Bạn có thể đơn giản hóa tất cả các công cụ sao chép sâu đó bằng 'a [key] .slice (0)'. –

4

Bạn có thể thực hiện một "bản sao" chức năng tạo ra một đối tượng mới, dựa trên gốc đối tượng constructor, và sau đó sao chép rằng gốc thuộc tính đối tượng cũng nếu chúng là đối tượng:

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

Tôi đã gặp vấn đề này trước đây, và đây chính xác là cách tôi giải quyết nó. +1 – NateDSaint

+1

Tạo mẫu thử phá vỡ điều này. Đơn giản 'Object.prototype.foo = function() {};' sẽ tạo ra đệ quy vô hạn. –

+0

@ Jonathan: thêm câu lệnh if để ngừng đệ quy. – CMS

0

Vì đây sẽ hỗ trợ thêm cho mảng sâu sao chép trong mã của bạn:

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); 
Các vấn đề liên quan