IT/JavsScript

객체 복사 ( Object.assign (), $.extend() )

라임웨일 2022. 6. 13. 10:22
반응형

 

1. Object.assign() 

열거할 수 있는 하나 이상의 출처 객체로부터 대상 객체로 속성을 복사할 때 사용합니다. 대상 객체를 반환합니다.

방법 : Object.assign(target,... sources)

  • target 합쳐지는 추가 객체의 속성을 받을 객체 또는 유일한 인자일 경우 jQuery 네임스페이스로 확장될 객체
  • ...sources 타겟 오브젝트에 병합
  • 리턴값으로 타겟 오브젝트를 반환
const obj = {a:1};
const copy = Object.assign( {}, obj );
console.log(copy); // {a: 1}
const obj1 = {a:1};
const obj2 = {b:2};
const obj3 = {c:3};
const newObj = Object.assign( {}, obj1, obj2, obj3 );
console.log(newObj); // {a: 1, b: 2, c: 3}
const obj1 = {a:1};
const obj2 = {b:2};
const obj3 = {c:3};
const newObj = Object.assign( obj1, obj2, obj3 );
console.log(newObj); // {a: 1, b: 2, c: 3}
console.log(obj1);   // {a: 1, b: 2, c: 3}

 

2. $.extend()

jQuery.extend( target [, object1 ] [, objectN ] )

  • target 합쳐지는 추가 객체의 속성을 받을 객체 또는 유일한 인자일 경우 jQuery 네임스페이스로 확장될 객체
  • object1 합쳐질 때 기준이 될 객체
  • objectN 기준 객체에 합쳐질 추가 객체

jQuery.extend([deep ], target, object1 [, objectN ] )  : 깊은 복사

  • deep true 라면, 깊은 수준 복사가 됩니다.
  • target 합쳐지는 추가 객체의 속성을 받을 객체 또는 유일한 인자일 경우 jQuery 네임스페이스로 확장될 객체
  • object1 합쳐질 때 기준이 될 객체
  • objectN 기준 객체에 합쳐질 추가 객체

오브젝트 a와 b를 합치고 싶은 경우

const a = {
  id: 1,
  name: 'A'
};

const b = {
  name: 'B',
  hobby: 'football'  
};

$.extend(a, b);
console.log(a);

// 결과:
// {
//    id: 1,
//    name: "B",
//    hobby: "football"
// }

 

$.extend(a, b)를 실행하면 a에 b를 합쳐 줍니다. 같은 프로퍼티가 존재한다면 b의 값으로 덮어쓰기를 하며 b에 있는 프로퍼티가 새로운 값이라면 추가를 합니다. 그리고 extend() 함수는 파라미터로 넣을 오브젝트의 개수 제한이 없습니다.

const a = {
  id: 1,
  name: 'TAM'
};


const b = {
  name: 'TAM-new',
  hobby: 'football'  
};


const c = {
  name: 'TAM-new-new',
  job: 'designer'
};


$.extend(a, b, c);
console.log(a);

// 결과:
// {
//    id: 1,
//    name: "TAM-new-new",
//    hobby: "football",
//    job: "designer"
// }

 

이런 식으로 무제한으로 파라미터를 설정 할 수 있으며 $.extend(a, b, c)를 실행할 경우 a의 값에 b를 합치며 그 값에 c를 합칩니다. 합쳐진 결과 값이 직접적으로 a 오브젝트(첫번째 파라메터)에 반영이 되므로 첫번째 파라메터가 변하는걸 원치 않는 경우에는 첫번째 파라메터를 {}으로 지정 한 뒤 리턴값을 새로운 오브젝트에 넣어주면 됩니다.

const a = {
  id: 1,
  name: 'TAM'
};


const b = {
  name: 'TAM-new',
  hobby: 'football'  
};


var newobject = $.extend({}, a, b);

 

마지막으로 프로퍼티가 오브젝트일 경우를 알아보겠습니다.

 

const a = {
  style: {
     top: 100,
     left: 200,
     width: 300
  },
  duration: 1000
};


const b = {
  style: {
    height: 400
  }
};

$.extend(a, b);
console.log(a);

// 결과:
// {
//   style: {
//     height: 400
//   },
//   duration: 1000
// }

 

프로퍼티가 오브젝트일 경우 a.style.top, a.style.left, a.style.width는 모두 지워지고 b.style.height만 덮어 씌워지게 됩니다.

밑의 계층까지 합치고 싶은 경우에는 extend()의 첫 번째 파라미터에 true를 넣으면 됩니다.

const a = {
  style: {
     top: 100,
     left: 200,
     width: 300
  },
  duration: 1000
};


const b = {
  style: {
     height: 400
  }
};


$.extend(true, a, b);
console.log(a);

// 결과:
// {
//   style: {
//      top: 100,
//      left: 200,
//      width: 300
//      height: 400
//    },
//    duration: 1000
//  }

 

출처 : https://y-chyachya.tistory.com/15

 

 

반응형