2012-02-14 26 views
11

Tôi đang cố hợp nhất hai đối tượng bằng cách sử dụng jQuery $ .extend.

Sử dụng mã sau, tôi đang cố gắng cảnh báo ("Bóng - Gốc - Umpire"). Nhưng đầu ra hiện tại là (“Undefined - Stump - Umpire”). Nó không đạt được bản sao sâu (đệ quy). Làm cách nào để chúng tôi sửa lỗi này?

$(document).ready(function() { 

     debugger; 

     //$.extend 
     var obj3 = { throwable: { text1: 'Ball' }, text3: 'Umpire' }; 
     var obj4 = { throwable: { text4: 'Bat' }, text2: 'Stump' } 

     //Simple Copy 
     var result1 = $.extend(obj3, obj4); 
     //alert(result1.throwable.text4 + " - " + result1.text2 + " - " + result1.text3); 


     //Deep Copy 
     //First parameter is passed as Boolean true to accomplish deep (recursive) copy 
     var result2 = $.extend(true, obj3, obj4); 
     alert(result2.throwable.text1 + " - " + result2.text2 + " - " + result2.text3); 


    }); 

EDIT: Tôi gọi

(Deep) copying an array using jQuery

+0

** ** trong số đó: thẻ 'asp.net'' .net' 'jquery-ui'' jquery-plugins' có liên quan đến câu hỏi này không? – gdoron

Trả lời

7

Đoạn mã thứ hai của bạn hoạt động như mong đợi và thực hiện bản sao sâu obj4 vào obj3, khi chạy trong sự cô lập.

Vấn đề là, đoạn mã trước đó đã thực hiện một nông bản sao của obj4 vào obj3, hoàn toàn trọng throwable thành viên với obj4 's trong quá trình này. Do đó, throwable.text1 không còn tồn tại trong phạm vi obj3 sau khi mã đó đã chạy.

  • Ban đầu, obj3 là:

    { throwable: { text1: 'Ball' }, text3: 'Umpire' } 
    
  • Sau khi đoạn mã đầu tiên đã chạy, obj3 trở thành:

    { throwable: { text4: 'Bat' }, text3: 'Umpire', text2: 'Slump' } 
    
  • Cuối cùng, sau khi đoạn mã thứ hai đã chạy, obj3 vẫn là:

    { throwable: { text4: 'Bat' }, text3: 'Umpire', text2: 'Slump' } 
    
+0

Cảm ơn lời giải thích rất rõ ràng. – Lijo

0

Trong code của bạn, text1 tài sản được ghi đè bởi extend. Tôi e bạn muốn có một phương pháp mà nối các chuỗi, mã của riêng bạn, extend không làm điều đó.

Cái gì như:

function(o1, o2) { 
    var ores = {}; 
    for(var p in o1) ores.p = o1.p; 
    for(var p in o2) ores.p = ores.p ? ores.p+o2.p : o2.p; 
    return ores; 
} 
+0

@Lijo nếu bạn muốn thấy sự khác biệt: [xem] (http://api.jquery.com/jQuery.extend/) – Hadas

+0

Tạo một phép hợp nhất đệ quy sẽ không ghép nối srting! – sinsedrix

+0

Vì vậy, nó có vẻ như wotk bây giờ ... vấn đề là gì? – sinsedrix

0

Vấn đề là, rằng có hai thuộc tính có cùng tên trong các đối tượng: text1. Ngay cả với mở rộng sâu, jquery mở rộng không hợp nhất này vào một chuỗi concat mới hoặc một mảng.

Bản sao sâu có liên quan, nếu một trong các thuộc tính của bạn là một đối tượng khác. Với mở rộng sâu, tất cả các thuộc tính của đối tượng con được hợp nhất và không chỉ chính đối tượng con.

Tôi nghĩ bạn phải đi với chức năng mở rộng của riêng bạn.

Các vấn đề liên quan