2009-06-11 12 views
1

私はの組み込みのを探しています。これは、2つの連想配列またはオブジェクトを1つに結合する方法です。 Adobe AirでWebkitを使用すると、違いがあります。しかし、基本的に私は、2つのオブジェクトまたは連想配列あなたがする場合はあります2つのオブジェクトのプロパティを1つのオブジェクトにマージする組み込みのメソッドはありますか?

var obj1 = { prop1: "something", prop2 "anotherthing" }; 
var obj2 = { prop3: "somethingelse" }; 

をし、私はそれらをマージ行うと、上記の二つのオブジェクトのすべての組み合わせのキーと値を持つオブジェクトを作成します:

var obj3 = obj1.merge(obj2); //something similar to array's concat maybe? 

alert(obj3.prop1); //alerts "something" 
alert(obj3.prop2); //allerts "anotherthing" 
alert(obj3.prop3); //alerts "somethingelse" 

これを行う機能が組み込まれているか、手動で行う必要がありますか?

答えて

5

tryptychが言ったように、彼のサンプルコード(彼がそれを編集するまで危険で間違っていた)を除いて。次のようなものが良いでしょう。

mylib = mylib || {}; 
//take objects a and b, and return a new merged object o; 
mylib.merge = function(a, b) { 

    var i, o = {}; 
    for(i in a) { 
     if(a.hasOwnProperty(i)){ 
      o[i]=a[i]; 
     } 
    } 
    for(i in b) { 
     if(b.hasOwnProperty(i)){ 
      o[i]=b[i]; 
     } 
    } 

    return o; 

} 
//take objects a and b, and modify object a to have b's properties 
mylib.augment = function(a, b) { 
    var i; 
    for(i in b) { 
     if(b.hasOwnProperty(i)){ 
      a[i]=b[i]; 
     } 
    } 
    return a; 
} 

編集re:ferocious。ディープコピーはこれとは別の直交した機能ですが、私にとっては個人的なディープコピー機能があります。

function clone(o) { 
    var t,i; 
    if (o === undefined) { 
     return undefined; 
    } 
    if (o === null) { 
     return null; 
    } 
    if (o instanceof Function) { 
     return o; 
    } 
    if (! (o instanceof Object)) { 
     return o; 
    } else { 
     t = {}; 
     for (i in o) { 
      /* jslint complains about this, it's correct in this case. I think. */ 
      t[i] = clone(o[i]); 
     } 
     return t; 
    } 
    } 
+0

私はこの1つが好きですが、あなたは深いコピー(その中のオブジェクトをコピーする)をするためにそれを改造できますか? – jlarson

+0

done、(sorta)、mylib.merge(clone(a)、clone(b))は基本的には後のエフェクトです。 – Breton

4

組み込みメソッドはありません。いくつかの図書館は、あなたが何を記述するかを行う方法を提供しています1を自分で書く

は簡単です:

var merge = function(dest, source){ 
    // This will resolve conflicts by using the source object's properties 
    for (prop in source){ 
     dest[prop] = source[prop]; 
    } 
} 

// Use like so 
merge(obj1, obj2); 

は、編集:もはや危険であり、一般的にひんしゅくを買うのObject.prototypeを、修正します。

+3

この実装はご存じですか?あなたのコードのどこかでfor(x in obj)ループがある場合、forループはすべてのループで明示的にテストしない限り、マージ関数を反復します。これはおそらくあなたが望むものではありません。 – Breton

+0

それは、大きなオブジェクトで純粋なjavascriptでかなり遅くなるでしょう。あまりにもそれが存在しない悪いです。このようなものを持っていると意味があります/ –

+0

また、元のオブジェクトも変更されますが、それはあなたが望むものではないかもしれません。 – Breton

4

(本質的にプロトタイプの延びた方法と同様である)トリプティックのに代替の実装は、次のとおり

/** returns object with properties of both object1 and object2. 
    * if a collision occurs, properties of object1 take priority 
    */ 
function merge(object1,object2) { 
    var retObj = {}; 
    for (prop in object2){ 
     retObj[prop] = object2[prop]; 
    } 
    for (prop in object1){ 
     retObj[prop] = object1[prop]; 
    } 
    return retObj; 
} 

これは些細な欠点はない持っていない、従ってオブジェクトのプロトタイプを変更しません。