#21. for-in문

박현재·2020년 10월 31일
0

오늘은 객체의 반복문을 생성하는 방법 2가지에 대해서 알아보겠습니다.

1. 객체 생성자인 Object와 메서드인 keys, values, entries 등을 이용하는 방법

const obj = {
  name: 'melon',
  weight: 4350,
  price: 16500,
  isFresh: true
}

Object.keys(obj); // ['name', 'weight', 'price', 'isFresh']
Object.values(obj); // ['melon', 4350, 16500, true]

const entries = Object.entries(obj);
console.log(entries);
/*
entries === [
  ['name', 'melon'],
  ['weight', 4350],
  ['price', 16500],
  ['isFresh', true]
]
*/

2. for-in 문을 이용하는 방법

const obj = {
  name: 'melon',
  weight: 4350,
  price: 16500,
  isFresh: true
}

for (let key in obj) {
  const value = obj[key];
  console.log(key);
  console.log(value);
}

Assignment

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

let s = {
'생활속의회계': 'C',
'논리적글쓰기': 'B',
'독일문화의이해': 'B+',
'기초수학': 'D+',
'영어회화': 'C+',
'인지발달심리학': 'A+',
}

let getGrade = {
'A+': 4.5,
'A': 4,
'B+': 3.5,
'B': 3,
'C+': 2.5,
'C': 2,
'D+': 1.5,
'D': 1,
'F': 0
}
/*
1번문제 풀이순서
1번 문제의 목표: 인자로 받은 scores의 value에 문자 대신 학점(숫자)을 부여하는 것.
1) 따라서 scores value와 학점(숫자)을 키-값 쌍으로하는 객체를 생성해서 대입법을 사용.
아래와 같이 접근합니다.
(설명하기 위해 주어지는 객체 scores를 변수 s로 선언하겠습니다.

let s = {
  s['생활속의회계'] = getGrade[s['생활속의회계']];
  s['논리적글쓰기'] = getGrade[s['논리적글쓰기']];
  s['독일문화의이해'] = getGrade[s['독일문화의이해']];
  ... // 반복되는 문장 발견: {s[key] = getGrade[s[key]];}
  }

2) 반복되는 문장을 for-in문을 이용하여 작성해줍니다.

const getExamResult = (scores, requiredClasses) => {  
  for(let key in scores) {
    scores[key] = getGrade[scores[key]];
  }
} // 1번 문제 해결.

2번문제 풀이순서
설명하기 위해 주어진 requiredClasses 배열을 변수 r로 선언하겠습니다.
let r = ['영어회화', '기초수학', '공학수학', '컴퓨터과학개론'];

2번 문제의 목표: 객체 s의 키에는 없고, 배열 r의 인덱스에 있는 값을 객체 s의 키에 대입하고 값을 0으로 반환한다
풀이정리: s의 키에 r값이 있냐? 없으면 r값을 s의 키에 넣고 값을 0으로 반환!
1) 배열r[0]~r[r.length-1]까지 반복하면서 s의 키에 있는지 찾아야합니다.

for(let i in requiredClasses) {
  if(scores[requiredClasses[i]] === undefined) {
    scores[requiredClasses[i]] = 0;
  }
}

다음 표현에 대해서 설명하려고 한다.
if(scores[requiredClasses[i]] === undefined)
scores의 키에 배열 requiredClasses[i]가 없다면 undefined가 됩니다.
if함수의 괄호() 안 데이터타입이 Boolean이므로 이를 활용할 수 있습니다.
또한 다음과 같이 간략하게 바꿀 수 있어요!
if(!scores[requiredClasses[i]])

profile
바로 하자, Right Now!

0개의 댓글