2015-03-14 14 views
10

Tôi sao chép myObj để tempMyObjSửa đổi một bản sao của một đối tượng JavaScript đang gây ra đối tượng ban đầu để thay đổi

var tempMyObj = myObj; 

tempMyObj.entity là một mảng của các đối tượng. Tôi đang sửa đổi tempMyObj.entity dựa trên một số điều kiện. Vấn đề là nếu tôi sửa đổi tempMyObj.entity số myObj.entity cũng đang được sửa đổi.

for (j = 0; j < myObj.length; j++) { 
    if (myObj[j].type == "TableShape") { 
     var dupEntites = new Array(); 
     for (i = 0; i < myObj[j].entities.length; i++) { 
      if (chk.value != myObj[j].entities[i].id) { 
       var obj = {}; 
       obj.text = myObj[j].entities[i].text; 
       obj.id = myObj[j].entities[i].id; 
       dupEntites.push(obj); 
      } 
      else { 
       if (chk.checked) 
       { 
        var obj = {}; 
        obj.text = myObj[j].entities[i].text; 
        obj.id = myObj[j].entities[i].id; 
        dupEntites.push(obj); 
       } 
      } 
     } 
     tempMyObj[j].entities = dupEntites; 
    } 
} 
+2

bạn có thể chỉnh sửa câu hỏi của mình để thực sự đặt câu hỏi không? – kamaradclimber

+0

Điều này có thể hữu ích nếu bạn không sử dụng jQuery: http://stackoverflow.com/questions/728360/most-elegant-way-to-clone-a-javascript-object – tomek550

Trả lời

16

Rõ ràng là bạn có một số quan niệm sai về những gì tuyên bố var tempMyObj = myObj;.

Trong đối tượng JavaScript được truyền và gán theo tham chiếu (chính xác hơn giá trị của tham chiếu), vì vậy tempMyObjmyObj là cả hai tham chiếu đến cùng một đối tượng.

Dưới đây là một minh họa đơn giản có thể giúp bạn hình dung những gì đang xảy ra

// [Object1]<--------- myObj 

var tempMyObj = myObj; 

// [Object1]<--------- myObj 
//  ^
//   | 
//   ----------- tempMyObj 

Như bạn có thể nhìn thấy sau khi chuyển nhượng, cả hai tài liệu tham khảo được trỏ đến cùng một đối tượng.

Bạn cần phải tạo bản sao nếu bạn cần sửa đổi một bản sao chứ không phải bản kia.

// [Object1]<--------- myObj 

var tempMyObj = jQuery.extend(true, {}, myObj); 

// [Object1]<--------- myObj 
// [Object2]<--------- tempMyObj 

Dưới đây là một vài cách để tạo ra một bản sao của một đối tượng

Vì bạn đang sử dụng jQuery:

var newObject = jQuery.extend(true, {}, myObj); 

Với vanilla JavaScript

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] = obj[attr]; 
    } 
    return copy; 
} 

var newObject = clone(myObj); 

Xem herehere

+1

@JAAulde, cảm ơn bạn đã cập nhật câu trả lời đăng cập nhật của bạn lên câu hỏi. Tôi không chắc tôi có thể bắt được điều đó không. – robbmj

+2

Không sao cả! Khi tôi thực hiện một chỉnh sửa mở rộng cho một câu hỏi đã được trả lời, tôi cố gắng theo dõi. :) – JAAulde

1

Hãy thử sử dụng $.extend():

Tuy nhiên, nếu bạn muốn giữ cả hai đối tượng ban đầu, bạn thể làm như vậy bằng cách thông qua một đối tượng rỗng như mục tiêu:

var object = $.extend({}, object1, object2);


var tempMyObj = $.extend({}, myObj); 
+0

bingo, đó là những gì tôi sắp sửa viết .. :) – Rohit416

+2

JavaScript hiện đã tích hợp chức năng tương tự, ['Object.assign()'] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/ Đối tượng/chỉ định). Ví dụ sử dụng: 'Object.assign ({}, myObj)'. –

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