2012-04-22 7 views
7

tôi những đoạn mã sau đây để sao chép một mảng kết hợp để khác,Sao chép mảng liên kết trong 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> 

Nhưng cảnh báo thứ hai nói "không xác định" .. Tôi có làm điều gì đó sai ở đây? Mọi con trỏ vui lòng ..

+5

Không có mảng liên kết trong javascript. – Niko

+6

Các mảng JavaScript không hoạt động với các phím không phải số. Đó là lý do tại sao '.slice' không chọn chúng. Sử dụng một đối tượng đơn giản thay vào đó và sau đó nhìn vào [Cách hiệu quả nhất để sao chép một đối tượng JavaScript là gì?] (Http://stackoverflow.com/questions/122102/what-is-the-most-efficient-way-to- clone-a-javascript-object). –

+1

@Niko: Mảng là các đối tượng ngay từ đầu ... chúng không bị "xoay". –

Trả lời

17

Trong mảng kết hợp JavaScript được gọi là đối tượng.

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

Tôi thường sử dụng var copy_db = $.extend({}, some_db); nếu tôi đang sử dụng jQuery.

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

Cảm ơn @maja.

+2

Điều này không tạo ra một bản sao ... –

+0

@FelixKling Cảm ơn duh. Đã sửa. – iambriansreed

+0

Thông báo, rằng chức năng không sao chép các đối tượng con – maja

4

Như @Niko đã nói trong nhận xét, không có mảng liên kết trong JavaScript.

Bạn đang thực sự đặt thuộc tính trên đối tượng mảng, đây không phải là ý tưởng hay. Bạn sẽ tốt hơn bằng cách sử dụng một đối tượng thực tế.

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

Nhiều thư viện thực hiện chính xác điều này (sao chép từ khóa này sang đối tượng khác). Đáng chú ý nhất là jQueryunderscore.js. Dấu gạch dưới cũng có _.clone(obj) có hiệu quả là _.extend({}, obj)

0

underscore.clone (http://underscorejs.org/#clone) có thể hữu ích. Nó thực hiện bản sao nông cho đối tượng hoặc mảng từ điển.

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

copy_db = _.clone(some_db); 
2

nếu bạn muốn sử dụng JSON, bạn có thể thực hiện việc này 'mảng kết hợp' đối tượng:

var assArray = {zero: 0, một: 1, hai: 2, ba: 3, những gì: 'bao giờ', bạn: 'muốn'};

và 'bản sao' nó như thế này:

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

+1

heh, mảng ass ... – Ogen