TIL 28 day 객체순회 문제

Winney·2020년 10월 4일
0

JavaScript에서 가장 중요하다는 객체 개념....
볼 때마다 새로운데 새롭지 않을 날이 올까...
내일부터 React 수업을 하기 때문에 JavaScript 개념 중 다시 봐야겠다 싶은 부분이 object였다.
특히 한참을 붙잡고 끙끙대던 문제가 있었기에 이를 복습하고자 한다.

문제

getExamResult 함수를 구현해주세요.
인자 scores 는 다음과 같은 객체입니다.
객체의 요소의 갯수 및 키의 이름들은 달라질 수 있습니다.
객체의 값은 다음 9가지 문자열 중에서 하나를 가지고 있습니다.
('A+', 'A', 'B+', 'B', 'C+', 'C', 'D+', 'D', 'F')
{
'생활속의회계': 'C',
'논리적글쓰기': 'B',
'독일문화의이해': 'B+',
'기초수학': 'D+',
'영어회화': 'C+',
'인지발달심리학': 'A+',
}
인자 requiredClasses 는 다음과 같이 문자열로 된 배열입니다.
['영어회화', '기초수학', '공학수학', '컴퓨터과학개론']
다음 조건을 만족하는 객체를 리턴하도록 함수를 구현해주세요

  1. scores 객체가 가지고 있는 키들은 새로운 객체에 포함되어야 합니다.
    단, 그 값들은 다음 원리에 따라 숫자로 바뀌어 할당되어야 합니다.
    A+ => 4.5
    A => 4
    B+ => 3.5
    B => 3
    C+ => 2.5
    C => 2
    D+ => 1.5
    D => 1
    F => 0
  1. requiredClass 배열의 요소로는 존재하지만, scores의 키로는 존재하지 않는 항목이 있다면,
    해당 요소는 새로운 객체의 키가 되고, 값으로 0을 가져야 합니다.
    위에서 예시로 묘사된 객체와 배열이 인자로 들어왔다면,
    다음과 같은 객체과 리턴됩니다. (요소간 순서는 다를수 있지만, 채점에 무관합니다.)
    {
    '생활속의회계': 2,
    '논리적글쓰기': 3,
    '독일문화의이해': 3.5,
    '기초수학': 1.5,
    '영어회화': 2.5,
    '인지발달심리학': 4.5,
    '공학수학': 0,
    '컴퓨터과학개론': 0,
    }

내가 풀었던 답

const getExamResult = (scores, requiredClasses) => {
    const result = {}
    
    
    const subjects = Object.keys(scores);
    const scoresValues = Object.values(scores);
    
    for (let i in requiredClasses) {
        if (subjects.includes(requiredClasses[i]) !== true) {
            result[requiredClasses[i]] = 0;
        } else {
            let scoresValues = Object.values(scores);
            let newValue;
        for (let j =0 ; j <scoresValues.length;j++) {
            let value = scoresValues[j]
            switch(value) {
                case('A+') :
                newValue = 4.5
                break;
                case('A') :
                newValue = 4.0
                break;
                case('B+') :
                newValue = 3.5
                break;
                case('B') :
                newValue = 3.0
                break;
                case('C+') :
                newValue = 2.5
                break;
                case('C') :
                newValue = 2.0
                break;
                case('D+') :
                newValue = 1.5
                break;
                case('D') :
                newValue = 1.0
                break;
                default  :
                newValue = 0
            }// switch문 끝
            result[subjects[j]] = newValue;   
        }//for문 끝   
      } // else if 끝
    }// for문 끝
    return result
    //======================================================
    return result
}

처음에 'A+ => 4.5' 형태를 본 순간 switch문을 써야겠다고 생각을 했다. 안타깝게도 만 하루동안의 삽질에 switch문은 돌아갔지만 2번문제가 해결되지 않아 고생하다가 결국 switch문으로 문제를 풀었었다.
지금 생각해보면 내가 2번문제를 풀지 못하고 헤매고 객체순회 개념을 사용하지 못 한것은 result[requiredClasses[i]] = 0;와 같은 property를 이용한 객체접근의 개념을 이해 못 했기 때문이라도 본다.
이 후에도 빈 객체에 새로운 property를 할당하는 부분에서 여전히 생소함을 느끼고 있다.

객체순회 개념을 쓴 답

const getExamResult = (scores, requiredClasses) => {
  const result = {};
  
  let obj = {
    'A+': 4.5,
    'A': 4,
    'B+': 3.5,
    'B': 3,
    'C+': 2.5,
    'C': 2,
    'D+': 1.5,
    'D': 1,
    'F': 0
  };
  
  for (let i=0; i < requiredClasses.length; i++) {
    let key = requiredClasses[i];
    result[key] = 0;
  }
  
  for (let j in scores) {  
    let grade = scores[j];
    result[j] = obj[grade];
  }  
   
  return result;
}

객체를 어떻게 쓰는지 알 수 있는 답이다.
1. for 구문을 써서 빈 result 객체에 requiredClasses의 각 요소를 키로 지정해 키값은 0으로 해서 객체에 넣는다. 기존에 있지 않은 과목은 점수를 0으로 하라고 했기 때문이다.
2. grade라는 변수를 선언 후 여기에 scores의 값을 할당한다.
3. result[j] 즉, result의 값들에 obj[grade]가 할당된다.
다시 말해서 grade에 해당하는 obj의 값들이 할당된다.

두번째 for...in문을 이해하는 게 너무 힘들었다.
result[j] = obj[grade];에서 obj[grade]가 뭔지를 파악하는게 너무 힘들었다.
지금도 바로 머리에 들어오지는 않는데 이 부분은 자주 보면서 익혀야 할 것같다.

중요object[key] = value

profile
프론트엔드 엔지니어

0개의 댓글