2009-06-11 9 views
1

Ich bin auf der Suche nach einer integrierten Methode, die zwei assoziative Arrays oder Objekte zu einem kombiniert. Verwenden von Webkit in Adobe Air, wenn dies einen Unterschied macht. Aber im Grunde habe ich zwei Objekte oder assoziative Arrays, wenn man so will:Gibt es eine integrierte Methode, um die Eigenschaften von zwei Objekten zu einem einzigen Objekt zusammenzuführen?

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

und ich möchte sie tun verschmelzen und ein Objekt zu erstellen, die alle hat die kombinierten Schlüssel und Werte der obigen zwei Objekte:

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" 

Jede eingebaute Funktion, die dies tut oder muss ich manuell tun?

Antwort

5

Wie tryptych sagte, außer dass sein Beispielcode (war gefährlich und falsch, bis er es bearbeitet). etwas mehr wie das Folgende wäre besser.

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; 
} 

bearbeiten re: wild. Deep Copy ist eine andere und orthogonale Funktion zu diesem, aber nur für Sie, hier ist meine persönliche tiefe Kopie-Funktion

+0

Ich mag diesen, aber könnten Sie ihn modifizieren, um eine tiefe Kopie zu machen (kopieren Sie die Objekte darin)? – jlarson

+0

getan, (sorta), mylib.merge (Klon (a), Klon (b)) für im Wesentlichen den Effekt, den Sie anstreben. – Breton

4

Es gibt keine integrierte Methode. Mehrere Bibliotheken bieten eine Methode, um das zu tun, was Sie beschreiben.

ein Schreiben selbst ist einfach:

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); 

edit: nicht mehr modifizieren Object.prototype, die auf gefährliche und in der Regel verpönt ist.

+3

Passen Sie diese Implementierung. Wenn Sie irgendwo in Ihrem Code eine for (x in obj) -Schleife haben, iteriert die for-Schleife über die Zusammenführungsfunktion, es sei denn, Sie testen in allen Ihren Schleifen explizit danach. Dies ist wahrscheinlich nicht das, was Sie wollen. – Breton

+0

Das ist scheiße, wäre ziemlich langsam mit reinem Javascript mit großen Objekten. Schade, dass es nicht existiert. Sinn macht es, so etwas nicht zu haben/ –

+0

Darüber hinaus wird es das ursprüngliche Objekt ändern, was auch nicht das sein kann, was Sie wollen. – Breton

4

Eine alternative Implementierung zum Triptych der (welche sich Verfahren im wesentlichen das gleiche wie Prototype ist) ist:

/** 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; 
} 

Dies ändert nicht den Prototyp-Objekt und somit nicht, dass es nicht zu vernachlässigende Nachteile nicht aufweist.

Verwandte Themen