웹개발/javascript
[자바스크립트] 자바스크립트 객체 합치는 다양한 방법
joamashi
2024. 7. 30. 00:34
자바스크립트에서 객체를 합치는 방법은 다양합니다. 각 방법마다 장단점이 있으므로, 상황에 맞게 적절한 방법을 선택하는 것이 중요합니다.
1. Object.assign()
- 기본적인 객체 병합: 기존 객체를 변경하면서 새로운 객체의 프로퍼티를 추가합니다.
- 얕은 복사: 중첩된 객체는 참조만 복사되므로 주의해야 합니다.
- 사용법:
const obj1 = { a: 1, b: 2 };
const obj2 = { c: 3, d: 4 };
const mergedObj = Object.assign({}, obj1, obj2);
console.log(mergedObj); // { a: 1, b: 2, c: 3, d: 4 }
2. Spread 연산자 (...)
- 객체 리터럴에서 사용: 새로운 객체를 생성하면서 기존 객체의 프로퍼티를 펼쳐 넣습니다.
- 얕은 복사: Object.assign()과 동일하게 얕은 복사를 수행합니다.
- 사용법:
const obj1 = { a: 1, b: 2 };
const obj2 = { c: 3, d: 4 };
const mergedObj = { ...obj1, ...obj2 };
console.log(mergedObj); // { a: 1, b: 2, c: 3, d: 4 }
3. ES6+의 병합 연산자 (Object.assign()의 간결한 버전)
- 기존 객체를 변경: Object.assign()과 동일하게 기존 객체를 변경합니다.
- 얕은 복사: 얕은 복사를 수행합니다.
- 사용법:
const obj1 = { a: 1, b: 2 };
const obj2 = { c: 3, d: 4 };
obj1 = { ...obj1, ...obj2 };
console.log(obj1); // { a: 1, b: 2, c: 3, d: 4 }
4. Lodash의 _.merge()
- 깊은 복사: 중첩된 객체도 깊게 복사하여 새로운 객체를 생성합니다.
- 다양한 옵션: 커스텀 병합 로직을 구현할 수 있는 다양한 옵션을 제공합니다.
- 외부 라이브러리: Lodash 라이브러리를 추가해야 사용할 수 있습니다.
- 사용법:
const _ = require('lodash');
const obj1 = { a: 1, b: { c: 2 } };
const obj2 = { b: { d: 3 } };
const mergedObj = _.merge({}, obj1, obj2);
console.log(mergedObj); // { a: 1, b: { c: 2, d: 3 } }
5. Reduce를 이용한 객체 합치기
- 유연성: 배열의 요소들을 순회하며 객체를 합칠 수 있어 다양한 조건을 설정할 수 있습니다.
- 사용법:
const arr = [{ a: 1 }, { b: 2 }, { c: 3 }];
const mergedObj = arr.reduce((acc, cur) => ({ ...acc, ...cur }), {});
console.log(mergedObj); // { a: 1, b: 2, c: 3 }
6. 함수를 이용한 객체 합치기
- 커스텀 로직: 복잡한 병합 로직을 구현하기 위해 함수를 직접 작성할 수 있습니다.
- 사용법:
function mergeObjects(...objects) {
return objects.reduce((acc, cur) => ({ ...acc, ...cur }), {});
}
const obj1 = { a: 1 };
const obj2 = { b: 2 };
const obj3 = { c: 3 };
const mergedObj = mergeObjects(obj1, obj2, obj3);
console.log(mergedObj); // { a: 1, b: 2, c: 3 }
7. 조건에 따른 병합
- 특정 조건: 특정 조건에 맞는 프로퍼티만 병합할 수 있습니다.
- 사용법:
const obj1 = { a: 1, b: 2 };
const obj2 = { b: 3, c: 4 };
const mergedObj = { ...obj1, ...obj2 }; // b는 obj2의 값으로 덮어씌워짐
// b 프로퍼티는 합치지 않고, 나머지 프로퍼티만 합치기
const mergedObj2 = { ...obj1, ...Object.keys(obj2).filter(key => key !== 'b').reduce((acc, key) => ({ ...acc, [key]: obj2[key] }), {}) };
console.log(mergedObj2); // { a: 1, b: 2, c: 4 }
4. 깊은 복사와 병합
- 깊은 복사 라이브러리: lodash의 _.merge() 외에도 다른 깊은 복사 라이브러리를 사용할 수 있습니다.
- 사용법:
const _ = require('lodash');
const obj1 = { a: 1, b: { c: 2 } };
const obj2 = { b: { d: 3 } };
const mergedObj = _.merge({}, obj1, obj2);
console.log(mergedObj); // { a: 1, b: { c: 2, d: 3 } }
5. TypeScript 인터페이스 활용
- 타입 안전: TypeScript 인터페이스를 사용하여 객체의 구조를 정의하고 안전한 병합을 수행할 수 있습니다.
- 사용법:
interface Person {
name: string;
age: number;
}
const person1: Person = { name: 'Alice', age: 30 };
const person2: Person = { name: 'Bob', age: 25 };
const mergedPerson: Person = { ...person1, ...person2 }; // TypeScript 컴파일러가 타입을 검사
728x90