[javascript] 객체 병합 (연관 배열)

JavaScript에서 두 개의 연관 배열을 병합하는 가장 좋은 / 표준 방법은 무엇입니까? 모두가 자신의 for루프 를 굴려서 그것을합니까 ?



답변

jquery를 사용하면 호출 할 수 있습니다 $.extend

var obj1 = {a: 1, b: 2};
var obj2 = {a: 4, c: 110};

var obj3 = $.extend(obj1, obj2);

obj1 == obj3 == {a: 4, b: 2, c: 110} // Pseudo JS

(연관 배열은 js의 객체입니다)

여기를보십시오 : http://api.jquery.com/jQuery.extend/


편집 : rymo가 제안한 것처럼 다음 과 같이하는 것이 좋습니다.

obj3 = $.extend({}, obj1, obj2);
obj3 == {a: 4, b: 2, c: 110}

여기에서 obj1 (및 obj2)은 변경되지 않습니다.


edit2 : 2018 년에 수행하는 방법은 Object.assign다음과 같습니다.

var obj3 = Object.assign({}, obj1, obj2);
obj3 === {a: 4, b: 2, c: 110} // Pseudo JS

ES6으로 작업하는 경우 Spread Operator를 사용하면됩니다 .

const obj3 = { ...obj1, ...obj2 };


답변

이제 2016 년 가장 좋은 표준 방법은 Object.assign ()
Pure Javascript 라고 말합니다 . jQuery가 필요하지 않습니다.

obj1 = {a: 1, b: 2};
obj2 = {a: 4, c: 110};
obj3 = Object.assign({},obj1, obj2);  // Object {a: 4, b: 2, c: 110}

자세한 정보, 예제 및 polyfill :
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign


답변

이것이 프로토 타입이하는 방식입니다 :

Object.extend = function(destination, source) {
    for (var property in source) {
        if (source.hasOwnProperty(property)) {
            destination[property] = source[property];
        }
    }
    return destination;
};

예를 들어

var arr1 = { robert: "bobby", john: "jack" };
var arr2 = { elizabeth: "liz", jennifer: "jen" };

var shortnames = Object.extend(arr1,arr2);

편집 : 의견에서 bucabay가 올바르게 지적한 hasOwnProperty () 확인을 추가했습니다.


답변

간단하게 …

function mergeArray(array1,array2) {
  for(item in array1) {
    array2[item] = array1[item];
  }
  return array2;
}


답변

밑줄 에는 확장 방법이 있습니다.

소스 객체의 모든 속성을 대상 객체로 복사합니다. 순서가 다르므로 마지막 소스는 이전 인수에서 같은 이름의 속성을 재정의합니다.

_.extend(destination, *sources)

_.extend({name : 'moe'}, {age : 50});
=> {name : 'moe', age : 50}


답변

에서 도장 , 2 객체 / 배열 “병합”될 것이다 lang.mixin(destination, source)– 당신은 또한, 하나 개의 목적지로 등 여러 소스를 혼합 할 수 있습니다 – 볼 믹스 인 함수의 참조 자세한 내용을.


답변

이름은 같지만 값이 아닌 경우 속성을 덮어 쓰시겠습니까?

원래 객체 중 하나를 영구적으로 변경하고 싶습니까?

또는 새로운 병합 된 개체를 반환 하시겠습니까?

function mergedObject(obj1, obj2, force){
    for(var p in obj1) this[p]= obj1[p];
    for(var p in obj2){
        if(obj2.hasOwnProperty(p)){
            if(force || this[p]=== undefined) this[p]= obj2[p];
            else{
                n= 2;
                while(this[p+n]!== undefined)++n;
                this[p+n]= obj2[p];
            }
        }
    }
}