2011-07-08 47 views
7

Tôi có 1 đối tượng đến từ máy chủ với nhiều thuộc tính mà tôi muốn hydrate nó thành đối tượng mới, thay đổi tên của 1 thuộc tính và giữ phần còn lại.Sao chép thuộc tính đối tượng Javascript

Code:

JSON: { UserId: 1, Name: "Woo", Age: 10 }

Định dạng của đối tượng tôi muốn nó trong:

var newObj = {} 
newObj.id = jsonObj.UserId; 
//Everything property below here is the same. How can i prevent writing this code? 
newObj.Name = jsonObj.Name; 
newObj.Age = jsonObj.Age; 

Những gì tôi đang làm là dựa trên answer này, cố gắng để phân tích một số json vào một định dạng yêu cầu tôi thay đổi tên của 1 thuộc tính.

+0

câu hỏi của bạn là gì? – Ibu

+0

trùng lặp: http://stackoverflow.com/questions/171251/how-can-i-merge-properties-of-two-javascript-objects-dynamically –

+0

Có aroth là đúng.Và để phân tích cú pháp json thành một đối tượng json bằng cách sử dụng phương thức jquery parseJSON. – Neeraj

Trả lời

15

Đối với một trường hợp đơn giản như vậy, bạn có thể làm một cái gì đó như:

var newObj = {id: jsonObj.UserId, Name: jsonObj.Name, Age: jsonObj.Age}; 

Đối với một đối tượng phức tạp hơn với một số lượng lớn các lĩnh vực, bạn có thể thích một cái gì đó như:

//helper function to clone a given object instance 
function copyObject(obj) { 
    var newObj = {}; 
    for (var key in obj) { 
     //copy all the fields 
     newObj[key] = obj[key]; 
    } 

    return newObj; 
} 


//now manually make any desired modifications 
var newObj = copyObject(jsonObj); 
newObj.id = newObj.UserId; 
+0

làm việc này, cảm ơn rất nhiều. –

+0

Xin chào. Có phải chức năng này là "Bản sao sâu", nó có hoạt động với các đối tượng bên trong mà jsonObj đã đặt làm các thuộc tính không? – stefgosselin

+0

@stefgosselin - Không, nó không phải là một bản triển khai bản sao sâu thích hợp. Điều đó sẽ yêu cầu đệ quy thông qua bất kỳ trường 'Array' và' Object' nào trong đối tượng. Nếu đối tượng được sao chép có chứa bất kỳ trường nào như vậy, thì phương thức này chỉ tạo ra một bản sao nông của các đối tượng/mảng lồng nhau. – aroth

1

Dont thực sự hiểu câu hỏi của bạn, nhưng đây là những gì tôi thường làm khi tôi trích xuất từ ​​một đối tượng hiện có:

var newObj = new Object(jsonObj); 
alert(newObj.UserId === jsonObj.UserId); //returns true 

Đó là những gì bạn đang hỏi? Hy vọng rằng sẽ giúp.

+0

+1 Mẹo hay. Chỉ cần chắc chắn, JS không phải là ngôn ngữ chính của tôi, 'newObj' _would là một bản sao của jsonObj và không phải là một tham chiếu mà thay đổi giá trị trong jsonObj sẽ không ảnh hưởng đến newObj? .. Tôi nên tát này trong fiddle nhưng quá lười biếng. heh :) – stefgosselin

+0

Nó sẽ là một bản sao và bạn luôn truy cập thuộc tính đọc/ghi bằng cách sử dụng newObj.Id. Nếu bạn thay đổi các thuộc tính bằng cách sử dụng .prototype, thì nó sẽ thay đổi các giá trị trong lớp cơ sở :) –

+3

Tôi thích giải pháp này cho sự đồng nhất của nó, nhưng nó đi kèm với một caveat quan trọng: 'newObj' và' jsonObj' sẽ tham chiếu đến cùng vật. Vì vậy, việc thay đổi một trường trong cùng một nguyên nhân khiến cho sự thay đổi đó xuất hiện trong trường khác. Dưới đây là ví dụ minh họa điều này: http://jsfiddle.net/3JvAd/ – aroth

1
function clone(o) { 
if(!o || 'object' !== typeof o) { 
    return o; 
} 
var c = 'function' === typeof o.pop ? [] : {}; 
var p, v; 
for(p in o) { 
if(o.hasOwnProperty(p)) { 
    v = o[p]; 
    if(v && 'object' === typeof v) { 
    c[p] = clone(v); 
    } 
    else { 
    c[p] = v; 
    } 
} 
} 
return c; 
} 
3

Nếu bạn muốn sao chép chỉ các lĩnh vực cụ thể

/** 
    * Returns a new object with only specified fields copied. 
    * 
    * @param {Object} original object to copy fields from 
    * @param {Array} list of fields names to copy in the new object 
    * @return {Object} a new object with only specified fields copied 
    */ 
    var copyObjectFields = function (originObject, fieldNamesArray) 
    { 
     var obj = {}; 

     if (fieldNamesArray === null) 
      return obj; 

     for (var i = 0; i < fieldNamesArray.length; i++) { 
      obj[fieldNamesArray[i]] = originObject[fieldNamesArray[i]]; 
     } 

     return obj; 
    }; 


//example of method call 
var newObj = copyObjectFields (originalObject, ['field1','field2']); 
Các vấn đề liên quan