Computer >> 컴퓨터 >  >> 프로그래밍 >> JavaScript

두 객체를 단일 객체로 병합하고 동일한 키의 값을 합산하는 JavaScript 프로그램

두 개의 객체를 입력받아 하나의 객체로 병합하고, 동일한 키를 가진 값들은 서로 더하는 함수를 작성해야 합니다. 이때 선형 시간(O(n))상수 공간 안에서 처리해야 하며, 이는 최대 한 번의 루프만 사용하고 기존 객체의 속성을 그대로 활용하여 새로운 변수나 객체를 추가로 생성하지 않는다는 의미입니다.

접근 방식

핵심 아이디어는 간단합니다. 첫 번째 객체(obj1)의 모든 키를 순회하면서, 두 번째 객체(obj2)에 같은 키가 존재하는지 확인합니다. 존재한다면 obj1의 해당 값에 obj2의 값을 누적해서 더해줍니다. 이렇게 하면 별도의 새 객체를 만들지 않고 기존 객체 자체에서 병합이 이루어지므로, 시간 복잡도 O(n), 공간 복잡도 O(1)를 만족할 수 있습니다.

예제 코드

const obj1 = {
   value1: 45,
   value2: 33,
   value3: 41,
   value4: 4,
   value5: 65,
   value6: 5,
   value7: 15,
};
const obj2 = {
   value1: 34,
   value3: 71,
   value5: 17,
   value7: 1,
   value9: 9,
   value11: 11,
};
const mergeObjects = (obj1, obj2) => {
   for(key in obj1){
      if(obj2[key]){
         obj1[key] += obj2[key];
      };
   };
   return;
};
mergeObjects(obj1, obj2);
console.log(obj1);

출력 결과

위 코드를 실행하면 콘솔에 다음과 같이 출력됩니다 −

{
   value1: 79,
   value2: 33,
   value3: 112,
   value4: 4,
   value5: 82,
   value6: 5,
   value7: 16
}

코드 설명

for...in 루프를 사용해 obj1의 각 키를 하나씩 순회합니다. 루프 내부에서는 obj2[key]가 존재하는지(truthy한 값인지) 확인한 뒤, 존재하면 obj1의 해당 키 값에 obj2의 값을 더합니다.

그 결과 value1은 45 + 34 = 79, value3은 41 + 71 = 112처럼 동일한 키의 값들이 합산됩니다. 반면 obj2에만 존재하는 value9, value11 같은 키는 obj1을 기준으로 순회하기 때문에 최종 결과에 포함되지 않습니다.

참고 사항

위 코드에서는 if(obj2[key]) 조건으로 키의 존재 여부를 검사하므로, 값이 0이거나 falsy한 경우에는 병합되지 않는다는 점에 유의해야 합니다. 보다 엄격하게 키 존재 여부를 확인하려면 key in obj2 또는 Object.prototype.hasOwnProperty.call(obj2, key)를 사용하는 것이 좋습니다.