2011-07-08 24 views
7

Sunucudan gelen 1 nesnenin yeni bir nesneyi hidratlamak istediğim birden çok özelliğe sahip olması, 1 özelliğin adını değiştirmesi ve geri kalanını tutması.Javascript nesne niteliklerinin kopyalanması

Kodu:

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

ben bunu istiyorum nesnenin biçimi:

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; 

Ne Bazı json ayrıştırmak için çalışıyor, bu answer dayanmaktadır yapıyorum 1 mülkün adını değiştirmemi gerektiren bir biçime.

+0

sorun nedir öneririm yerine yeniden yaratmak ait yeniden tercih? – Ibu

+0

yinelenen: http://stackoverflow.com/questions/171251/how-can-i-merge-properties-of-two-javascript-objects-dynamically –

+0

Evet aroth kullanarak json nesnesine json ayrıştırmak için right.And olduğunu jquery parseJSON yöntemi. – Neeraj

cevap

15

Böyle basit durumda, aşağıdaki gibi bir şey yapabilirsiniz: gerçekten

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

değiştiririm, çok teşekkürler. –

+0

Hey, güzel. Bu işlev "Deep copy", jsonObj'nin özellik olarak belirlediği iç nesnelerle mi çalışıyor? – stefgosselin

+0

@stefgosselin - Hayır, bu doğru bir derin kopya uygulaması değildir. Bu, nesnedeki herhangi bir "Array" ve "Object" alanlarının tekrarlanmasını gerektirir. Kopyalanan nesne bu tür alanlar içeriyorsa, bu yöntem sadece yuvalanmış nesnelerin/dizilerin sığ bir kopyasını oluşturur. – aroth

1

Dont: alanları çok sayıda daha karmaşık bir nesne için

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

, gibi bir şey tercih edebilirsiniz sorunuzu anlıyorum ama bu ben varolan nesneden ayıklamak zaman normalde ne olduğunu:

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

Sorduğun bu muydu? Umarım yardımcı olur.

+0

+1 Güzel tahmin. Emin olmak için, JS değil benim ana dili, 'newObj' _would bir jsonObj kopyası olup jsonObj değişen değer newObj etkileyecek bir referans olacak? .. Bunu kemanla tokat atmalıyım ama çok tembel. heh :) – stefgosselin

+0

Bir kopya olacak ve her zaman read/write özniteliğine newObj.Id kullanarak erişirsiniz. Eğer .prototype kullanarak özelliklerini değiştirmek, o zaman ben onun özlü olmak kaygısıyla bu çözümü gibi :) –

+3

temel sınıf değerleri değişecek, ancak önemli bir uyarıyla birlikte geliyor: jsonObj' aynı sevk edecektir '' newObj' ve nesne. Dolayısıyla, bir alanı bir diğeriyle değiştirmek, aynı değişimin diğerinde görünmesine neden olur. Bunu gösteren bir örnek: 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

Sadece uzmanlık alanları

/** 
    * 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']); 
İlgili konular