2009-06-11 4 views
1

내장형 배열 또는 객체를 하나로 결합하는 내장 메소드를 찾고 있습니다. Adobe Air에서 웹킷을 사용하면 효과가 있습니다. 그러나 기본적으로 저는 두 개체 또는 연관 배열 만약에 당신이 있습니다두 객체의 속성을 단일 객체에 병합하는 메서드가 내장되어 있습니까?

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. 딥 복사는 이것과는 다른 직각의 기능이지만, 당신만을위한 것입니다. 제 개인 복사 기능이 여기에 있습니다.

+0

나는이 하나가 마음에 들어하지만, 당신은 깊은 복사 (그것 내의 객체들을 복사)를 할 수 있겠는가? – jlarson

+0

done, (sorta), mylib.merge (clone (a), clone (b)). – Breton

4

기본 제공 방법이 없습니다. 여러 라이브러리는 사용자가 설명하는 것을 수행하는 방법을 제공합니다.

하나를 쓰기 자신은 간단하다 :

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

그게 싫어, 큰 개체와 함께 순수 자바 스크립트와 꽤 느려질 것입니다. 너무 나쁘다는 것은 존재하지 않습니다. 이것과 같은 것을 가지고있는 것은 의미가 있습니다./ –

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

이것은 사소한 단점이 아니다 없습니다 따라서 객체의 프로토 타입을 수정하지 않습니다.