문제 상황
다음과 같이 감성 분석 관련 데이터를 담고 있는 두 개의 객체가 있다고 가정해 보겠습니다.
const obj1 = {
positive: ['happy', 'excited', 'joyful'],
negative: ['depressed', 'sad', 'unhappy']
};
const obj2 = {
happy: 6,
excited: 1,
unhappy: 3
};여기서 obj1은 긍정(positive)과 부정(negative) 카테고리별 단어 목록을 담고 있으며, obj2는 각 단어에 대응하는 점수를 담고 있습니다.
우리는 이 두 객체를 인자로 받아, obj1의 각 카테고리에 속한 단어들의 점수를 obj2에서 찾아 합산한 뒤, 다음과 같은 형태의 결과 객체를 반환하는 JavaScript 함수를 작성해야 합니다.
const output = {positive: 7, negative: 3};동작 원리
긍정 카테고리에는 happy(6점)와 excited(1점)가 포함되어 있으므로 긍정 점수는 6 + 1 = 7이 됩니다. 반면 부정 카테고리의 단어 중 obj2에 실제로 존재하는 것은 unhappy(3점)뿐이므로 부정 점수는 3이 됩니다. joyful, depressed, sad처럼 obj2에 정의되지 않은 단어는 0점으로 처리합니다.
예제 코드
이를 구현한 코드는 다음과 같습니다.
const obj1 = {
positive: ['happy', 'excited', 'joyful'],
negative: ['depressed', 'sad', 'unhappy']
};
const obj2 = {
happy: 6,
excited: 1,
unhappy: 3
};
const findPositiveNegative = (obj1 = {}, obj2 = {}) => {
const result = {}
for (let key of Object.keys(obj1)) {
result[key] = obj1[key].reduce((acc, value) => {
return acc + (obj2[value] || 0);
}, 0)
};
return result;
};
console.log(findPositiveNegative(obj1, obj2));코드 설명
함수의 동작 과정을 단계별로 살펴보면 다음과 같습니다.
1. Object.keys(obj1) — obj1의 모든 키('positive', 'negative')를 배열 형태로 가져옵니다.
2. for...of 루프 — 각 키를 순회하며 해당 카테고리의 단어 배열에 접근합니다.
3. reduce() 메서드 — 각 단어의 점수를 누적 합산합니다. 이때 obj2[value] || 0 패턴을 사용하면 obj2에 존재하지 않는 단어도 오류 없이 기본값 0으로 처리할 수 있습니다.
또한 매개변수에 기본값 {}을 지정해두었기 때문에, 인자가 전달되지 않더라도 안전하게 동작한다는 장점이 있습니다.
출력 결과
콘솔에 출력되는 결과는 다음과 같습니다.
{ positive: 7, negative: 3 }