아래 설명을 읽고 getExamResult 함수를 구현하세요.
인자 scores 는 다음과 같은 객체입니다. 객체의 요소의 갯수 및 키의 이름들은 달라질 수 있습니다. 객체의 값은 다음 9가지 문자열 중에서 하나를 가지고 있습니다.'A+', 'A', 'B+', 'B', 'C+', 'C', 'D+', 'D', 'F' { '생활속의회계': 'C', '논리적글쓰기': 'B', '독일문화의이해': 'B+', '기초수학': 'D+', '영어회화': 'C+', '인지발달심리학': 'A+', }
인자 requiredClasses 는 다음과 같이 문자열로 된 배열입니다.
['영어회화', '기초수학', '공학수학', '컴퓨터과학개론']
다음 조건을 만족하는 객체를 리턴하도록 함수를 구현해주세요.
scores 객체가 가지고 있는 키들은 새로운 객체에 포함되어야 합니다. 단, 그 값들은 다음 원리에 따라 숫자로 바뀌어 할당되어야 합니다.A+ => 4.5 A => 4 B+ => 3.5 B => 3 C+ => 2.5 C => 2 D+ => 1.5 D => 1 F => 0
requiredClasses 배열의 요소로는 존재하지만, scores의 키로는 존재하지 않는 항목이 있다면, 해당 요소는 새로운 객체의 키가 되고, 값으로 0을 가져야 합니다. 위에서 예시로 묘사된 객체와 배열이 인자로 들어왔다면, 다음과 같은 객체과 리턴됩니다. 요소간 순서는 다를수 있지만, 채점에 무관합니다.
{ '생활속의회계': 2, '논리적글쓰기': 3, '독일문화의이해': 3.5, '기초수학': 1.5, '영어회화': 2.5, '인지발달심리학': 4.5, '공학수학': 0, '컴퓨터과학개론': 0, }
const getExamResult = (scores, requiredClasses) => {
for (let key in scores) {
const value = socres[key]
const numericScores =
}
}
const getExamResult = (scores, requiredClasses) => {
const value = scores[key];
getNum(value);
}
const getExamResult = (scores, requiredClasses) => {
const value = scores[key];
const numericScores = getNum(value);
scores[key] = numericScores;
}
const getExamResult = (scores, requiredClasses) => {
for(let key in scores){
const value = scores[key];
const numericScores = getNum(value);
scores[key] = numericScores;
}
}
const getExamResult = (scores, requiredClasses) => {
for(let key in scores){
const value = scores[key];
const numericScores = getNum(value);
scores[key] = numericScores;
}
const arrayKey = Object.keys(scores);
}
'키': 배열requiredClasses의 값, '값': 0
으로 추가한다.const getExamResult = (scores, requiredClasses) => {
for(let key in scores){
const value = scores[key];
const numericScores = getNum(value);
scores[key] = numericScores;
}
const arrayKey = Object.keys(scores);
if(!arrayKey.includes(requiredClasses[i]){
scores[requiredClasses[i]] = 0;
}
}
const getExamResult = (scores, requiredClasses) => {
for(let key in scores){
const value = scores[key];
const numericScores = getNum(value);
scores[key] = numericScores;
}
const arrayKey = Object.keys(scores);
for(let i in requiredClasses){
if(!arrayKey.includes(requiredClasses[i]){
scores[requiredClasses[i]] = 0;
}
}
}
const getExamResult = (scores, requiredClasses) => {
for(let key in scores){
const value = scores[key];
const numericScores = getNum(value);
scores[key] = numericScores;
}
const arrayKey = Object.keys(scores);
for(let i in requiredClasses){
if(!arrayKey.includes(requiredClasses[i]){
scores[requiredClasses[i]] = 0;
}
}
return scores;
}
const getExamResult = (scores, requiredClasses) => {
for(let key in scores){
const value = scores[key];
const numericScores = getNum(value);
scores[key] = numericScores;
}
const arrayKey = Object.keys(scores);
for(let i in requiredClasses){
if(!arrayKey.includes(requiredClasses[i])){
scores[requiredClasses[i]] = 0;
}
}
return scores;
}
const getNum = x => {
switch(x) {
case 'A+':
return 4.5;
break;
case 'A':
return 4;
break;
case 'B+':
return 3.5;
break;
case 'B':
return 3;
break;
case 'C+':
return 2.5;
break;
case 'C':
return 2;
break;
case 'D+':
return 1.5;
break;
case 'D':
return 1;
break;
case 'F':
default:
return 0;
break;
}
}
const a = {
'생활속의회계': 'C',
'논리적글쓰기': 'B',
'독일문화의이해': 'B+',
'기초수학': 'D+',
'영어회화': 'C+',
'인지발달심리학': 'A+',
};
const b = ['영어회화', '기초수학', '공학수학', '컴퓨터과학개론'];
console.log(getExamResult(a,b));
👉 링크
다음 객체에서 상수verb
의 값을 키로, 상수project
의 값을 그 키의 값으로 사용하시오
const information = {
name: '김개발'
}
const verb = 'developes'
const project = 'facebook'
👉
information.developes = 'facebook' // 항상 값이 정해져 있음
information[verb] = project // verb, project의 값에 따라 달라짐
객체에 있는 모든 키에 한번씩 접근하는 방법
어떤 객체가 가지고 있는 키들의 목록을 배열로 리턴하는 메소드
예)
const obj = {
name: 'melon',
weight: 4350,
price: 16500,
isFresh: true
}
Object.keys(obj) // ['name', 'weight', 'price', 'isFresh']
Object.values : 객체의 값으로 이루어진 배열을 리턴
Object.entries : 객체의 키-값 쌍인 길이 2짜리 배열로 이루어진, 배열을 리턴
(인덱스[0]: 키, 인덱스[1]: 값)
Object.entries 가 가장 유용하다!
객체와 배열을 위해 특별히 존재하는, ES6 에서 추가된 문법
배열: 기존의 for문을 간소화
/*
for (let i = 0; i < arr.length; i ++) {
console.log(i)
console.log(arr[i])
}
*/
for (let i in arr) {
console.log(i)
console.log(arr[i])
}
객체: 순서가 보장되지 않는 순회
for (let key in obj) {
const value = obj[key]
console.log(key)
console.log(value)
}
const getExamResult = (scores, requiredClasses) => {
for(let key in scores){
const value = scores[key];
const numericScores = {
'A+': 4.5,
'A': 4.0,
'B+': 3.5,
'B': 3.0,
'C+': 2.5,
'C': 2.0,
'D+': 1.5,
'D': 1.0,
'F': 0
}
scores[key] = numericScores[value];
}
for(let el of requiredClasses){
if(!Object.keys(scores).includes(el)){
scores[el] = 0;
}
}
return scores;
}
const scores = {
'생활속의회계': 'C',
'논리적글쓰기': 'B',
'독일문화의이해': 'B+',
'기초수학': 'D+',
'영어회화': 'C+',
'인지발달심리학': 'A+',
};
const requiredClasses = ['영어회화', '기초수학', '공학수학', '컴퓨터과학개론'];
console.log(getExamResult(scores,requiredClasses));
키
key에 대해 객체 순회하겠다for(let key in scores){
// 객체 순회 내용
}
키
로 접근한 학점값
을 value라고 선언한다// 객체 순회 내용1
const value = scores[key];
// ex) scores['생활속의회계'] === 'C' 이다
키
-점수값
쌍을 갖는 객체numericScores를 선언한다// 객체 순회 내용2
const numericScores = {
'A+': 4.5,
'A': 4.0,
'B+': 3.5,
'B': 3.0,
'C+': 2.5,
'C': 2.0,
'D+': 1.5,
'D': 1.0,
'F': 0
}
값
이 numericScores의 학점키
와 일치하면값
을 numericScores의 점수값
으로 재할당한다.값
을 ==> value
를키
로 넣고 접근한 점수값
==> numericScores[value]
키
로 접근한 학점값
에 ==> scores[key]
에// 객체 순회 내용3
scores[key] = numericScores[value];
// ex) scores['생활속의회계'] = numericScores['C+']
for(let el of requiredClasses){
// 객체 순회 내용
}
Object.keys(scores)
el
을 포함하지 않으면 ==> !Object.keys(scores)
.includes(el
)el
-값0
을 추가하겠다 ==> scores[el
] =0
;//객체 순회 내용
if(!Object.keys(scores).includes(el)){
scores[el] = 0;
}
참고로 for...in구문을 쓰면 index로 접근해야 한다:
for(let i in requiredClasses){
if(!Object.keys(scores).includes(requiredClasses[i])){
scores[requiredClasses[i]] = 0;
}
}
const getExamResult = (scores, requiredClasses) => {
for(let key in scores){
const value = scores[key];
const numericScores = x => {
if(x === 'F'){
return x = 0;
}else if(x.indexOf('+') === -1){
return x = 69 - x.charCodeAt(0);
}else{
return x = 69 - x.charCodeAt(0) + 0.5;
}
}
scores[key] = numericScores(value);
}
let scoKey = Object.keys(scores);
let scoValue = Object.values(scores);
for(let ele of requiredClasses)
if(!scoKey.includes(ele)){
scoKey.push(ele);
scoValue.push(0);
}
const scoresNew = {};
for(let i in scoKey){
scoresNew[scoKey[i]] = scoValue[i];
}
return scoresNew;
}
const a = {
'생활속의회계': 'C',
'논리적글쓰기': 'B',
'독일문화의이해': 'B+',
'기초수학': 'D+',
'영어회화': 'C+',
'인지발달심리학': 'A+',
};
const b = ['영어회화', '기초수학', '공학수학', '컴퓨터과학개론'];
console.log(getExamResult(a,b));
키
key에 대해 객체 순회하겠다for(let key in scores){
// 객체 순회 내용
}
키
로 접근한 학점값
을 value라고 선언한다 // 객체 순회 내용#1
const value = scores[key];
값
을 인자x로 받아 숫자로 변환할 함수numericScores를 선언한다.// 객체 순회 내용#2
const numericScores = x => {
}
charCodeAt
와indexOf
를 이용한다string.
charCodeAt
(index)
: 문자열string의 index번째 글자를 숫자로 반환한다
ex) 'ABCDF'.charCodeAt(1) === 66A: 65 ==> 4 ==> 69 - 65 ==> 69 - 'A~'.charCodeAt(0)
B: 66 ==> 3 ==> 69 - 66 ==> 69 - 'B~'.charCodeAt(0)
C: 67 ==> 2 ==> 69 - 67 ==> 69 - 'C~'.charCodeAt(0)
D: 68 ==> 1 ==> 69 - 68 ==> 69 - 'D~'.charCodeAt(0)
F: 70 ==> 0
// 객체 순회 내용#2
const numericScores = x => { // 학점을 인자로 받아서
if(x === 'F'){ // F면 0을 반환
return x = 0;
}else if(x.indexOf('+') === -1){ // F가 아니고 '+'가 없으면
return x = 69 - x.charCodeAt(0);
}else{ // F가 아니고 '+'가 있으면 +0.5
return x = 69 - x.charCodeAt(0) + 0.5;
}
}
false인 값: -0, 0, null, undefined, Nan, false, ""을 활용해 바꿔쓸수도 있겠다. 근데 나중에 다시보기에 난해하니 별로 추천하지 않음
else if( !(x.indexOf('+')+1) ){ // F가 아니고 '+'가 없으면 }
값
인 value를 인자로 넣고numericScores(value)
키
로 접근한 scores의 값
에scores[key]
// 객체 순회 내용#3
scores[key] = numericScores(value);
키
만 뽑은 배열scoKey와 값
만 뽑은 배열 scoValue를 선언한다 let scoKey = Object.keys(scores);
let scoValue = Object.values(scores);
for(let ele of requiredClasses){
// 객체 순회 내용
}
// 객체 순회 내용
if(!scoKey.includes(ele)){
scoKey.push(ele);
scoValue.push(0);
}
const getExamResult = (scores, requiredClasses) => {
for(let key in scores){
// 객체 순회 내용#1
// 객체 순회 내용#2
// 객체 순회 내용#3
}
let scoKey = Object.keys(scores);
let scoValue = Object.values(scores);
for(let ele of requiredClasses){
// 객체 순회 내용
}
const scoresNew = {};
// 10. scoKey, scoValue 합치기
return scoresNew;
}
키
i에 대하여 객체 순회로키
scoKey[i] - 값
scoValue[i]을 추가한다for(let i in scoKey){
scoresNew[scoKey[i]] = scoValue[i];
}
const getExamResult = (scores, requiredClasses) => {
for(let key in scores){
const value = scores[key];
const numericScores = {
'A+': 4.5,
'A': 4.0,
'B+': 3.5,
'B': 3.0,
'C+': 2.5,
'C': 2.0,
'D+': 1.5,
'D': 1.0,
'F': 0
}
scores[key] = numericScores[value];
}
for(let el of requiredClasses){
if(!scores[el]){ // 여기가 '다른 풀이#1'과 다른 부분
scores[el] = 0;
}
}
return scores;
}
const scores = {
'생활속의회계': 'C',
'논리적글쓰기': 'B',
'독일문화의이해': 'B+',
'기초수학': 'D+',
'영어회화': 'C+',
'인지발달심리학': 'A+',
};
const requiredClasses = ['영어회화', '기초수학', '공학수학', '컴퓨터과학개론'];
console.log(getExamResult(scores,requiredClasses));
배열requiredClasses의 요소el을 키
로
객체scores에 접근한 값
에 대해 ==> scores[el]
scores['공학수학'], scores['컴퓨터과학개론']은 추가되는 것이므로 값
undefined이다.
이 때, undefined는 false인 값
에 해당하므로 다음과 같이 쓸 수 있다:
for(let el of requiredClasses){
if(!scores[el]){ // 여기가 '다른 풀이#1'과 다른 부분
scores[el] = 0;
}
}