getExamResult
함수를 구현하세요.인자 scores
는 다음과 같은 객체입니다. 객체의 요소의 갯수 및 키의 이름들은 달라질 수 있습니다. 객체의 값은 다음 9가지 문자열 중에서 하나를 가지고 있습니다.
{
'생활속의회계': 'C',
'논리적글쓰기': 'B',
'독일문화의이해': 'B+',
'기초수학': 'D+',
'영어회화': 'C+',
'인지발달심리학': 'A+',
}
인자 requiredClasses
는 다음과 같이 문자열로 된 배열입니다.
['영어회화', '기초수학', '공학수학', '컴퓨터과학개론']
다음 조건을 만족하는 객체를 리턴하도록 함수를 구현해주세요.
scores
객체가 가지고 있는 키들은 새로운 객체에 포함되어야 합니다. 단, 그 값들은 다음 원리에 따라 숫자로 바뀌어 할당되어야 합니다.
requiredClasses
배열의 요소로는 존재하지만, scores
의 키로는 존재하지 않는 항목이 있다면, 해당 요소는 새로운 객체의 키가 되고, 값으로 0을 가져야 합니다. 위에서 예시로 묘사된 객체와 배열이 인자로 들어왔다면, 다음과 같은 객체과 리턴됩니다. 요소간 순서는 다를수 있지만, 채점에 무관합니다.
{
'생활속의회계': 2,
'논리적글쓰기': 3,
'독일문화의이해': 3.5,
'기초수학': 1.5,
'영어회화': 2.5,
'인지발달심리학': 4.5,
'공학수학': 0,
'컴퓨터과학개론': 0,
}
const getExamResult = (scores, requiredClasses) => {
var newScores = {};
for (let key in scores){
let value = scores[key]
value = 5 - (scores[key][0].toLowerCase().charCodeAt(0)-96);
ABCD로 적혀있는 학점을 숫자로 변환하기 위해, String 메서드인 .charCodeAt()을 사용했습니다.
이 경우 대문자 A는 65, 소문자 a는 97로 변환되기 때문에, 일괄 소문자로 바꿔주기 위해서 String 메서드인 .toLowerCase()를 같이 사용해주었고, 이후 간단한 연산을 통해 학점을 연결시켰습니다.
newScores[key] = scores[key].endsWith("+") ? value + 0.5 : value;
newScores[key] = value < 0 ? 0 : newScores[key];
}
A+, B+, C+, D+ 같은 경우 string메서드인 endsWith를 이용해 찾아준 뒤 +0.5점을 더해주었습니다.
아랫줄에 있는 코드는 만약 변환해준 학점이 음수일 경우 0점으로 재할당하라는 코드인데, 이것을 작성하게 된 이유는 .charCodeAt()을 이용해 학점을 변환했을 때
A->4 B->3 C->2 D->1 E->0 F-> '-1' 이 되어, F에 해당하는 값이 -1이 되어버리기 때문입니다.
let keyOfscores = Object.keys(newScores);
for (let key in requiredClasses){
keyOfscores.indexOf(requiredClasses[key]) < 0 ? newScores[requiredClasses[key]] = 0 : "무의미" ;
}
return newScores;
}
Array 메서드인 indexOf()를 이용해 requiredClasses 배열에 있는 값이 newScores에 없다면 (indexOF()메서드의 값이 -1 이라면) 해당 값을 key로, value는 0으로 newScores 객체에 추가시켜주었습니다.