2011-07-08 12 views
7

私は1つのオブジェクトを複数のプロパティでサーバーから取得しています。新しいオブジェクトに水分を入れ、1つのプロパティの名前を変更し、残りの部分を保持したいとします。Javascriptオブジェクトの属性をコピーする

コード:

JSON:いくつかのJSONを解析しようと、このanswerに基づいている私は何をやっている

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; 

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

私はそれをしたいオブジェクトのフォーマット1つのプロパティの名前を変更する必要がある形式に変換します。

+0

あなたの質問は何をお勧めしたいですか? – Ibu

+0

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

+0

はいarothは正しいです。そして、jsonオブジェクトをjsonオブジェクトに解析するjquery parseJSONメソッド。 – Neeraj

答えて

15

このような単純なケースでは、あなたが何かを行うことができます:本当に

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

ヘッダーを変更します。これはうまくいきました。ありがとうございました。 –

+0

ねえ、いいね。この関数は「ディープ・コピー」ですか、jsonObjがプロパティとして設定した内部オブジェクトで動作しますか? – stefgosselin

+0

@stefgosselin - いいえ、それは適切なディープコピーの実装ではありません。これは、オブジェクトの 'Array'と' Object'フィールドを再帰する必要があります。コピーされるオブジェクトにこのようなフィールドが含まれている場合、このメソッドはネストされたオブジェクト/配列のシャローコピーを作成するだけです。 – aroth

1

いけない:フィールドの数が多いと、より複雑なオブジェクトの場合

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

を、あなたのようなものを好むかもしれませんあなたの質問を理解してください。これは、既存のオブジェクトから抽出するときに私が通常行うことです:

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

それはあなたが求めていたものですか?希望が役立ちます。

+0

+1良いヒント。ただ、JSは私のメイン言語ではなく、 'newObj'はjsonObjのコピーでなければならず、jsonObjの値を変更してもnewObjに影響を与えないリファレンスではありませんか? ..私はフィドルでこれを打つべきですが、あまりにも怠惰です。 heh :) – stefgosselin

+0

これはコピーであり、常にnewObj.Idを使用して読み取り/書き込み属性にアクセスします。 .prototypeを使用して属性を変更すると、基本クラスの値が変更されます:) –

+3

私はこの解決策が簡潔であることを覚えていますが、重要な注意点があります: 'newObj'と' jsonObj'は同じオブジェクト。したがって、1つのフィールドを変更すると、同じ変更が他のフィールドに表示されます。これを示す例があります: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

あなたが唯一の特定のフィールド

/** 
    * 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']); 
関連する問題