for…in 자바스크립트 반복문

원본: How to loop through objects in JavaScript (for…in)

자바스크립트 개발을 하다 보면 나열 가능한 자료형(enumerable dataset)에 루프를 도는 작업을 해야할 때가 있습니다. 이러한 자료형에는 Array, List, Map, 객체 등이 있습니다.

이 포스트에서는 자바스크립트를 사용하여 객체의 key/value 쌍에 대해 루프를 도는 4 가지 방법에 대해 알아보겠습니다.

자바스크립트 객체에서 루프를 도는 방법은 다음과 같습니다:

  • for…in 루프 사용
  • Object.keys 메소드
  • Object.values 메소드
  • Object.entries 메소드

for…in 구문

객체의 속성에 대해 루프를 도는 가장 간단한 방법은 for…in 문을 사용하는 것 입니다. 이 방법은 Internet Explorer 6 이상의 모든 최신 브라우저에서 작동합니다.

개발자 도구에서 실제로 객체의 속성에 루프 도는 예제를 확인해 보겠습니다:

const user = {
    name: 'John Doe',
    email: 'john.doe@example.com',
    age: 25,
    dob: '08/02/1989',
    active: true
};

for (const key in user) {
    console.log(`${key}: ${user[key]}`);
}
for...in 예제

console.log() 메소드를 통해 객체의 정보를 모두 출력할 수 있지만 이 루프의 한 가지 문제점은 prototype의 속성에 대하여 루프를 돌게 된다는 점 입니다.

이 문제점을 방지하려면 hasOwnProperty() 메소드를 사용하여 속성이 객체에 속하는지 명시적으로 확인해야 합니다.

for (const key in user) {
    if (user.hasOwnProperty(key)) {
        console.log(`${key}: ${user[key]}`);
    }
}

이러한 번거로움을 피하기 위해 ES8 에서는 Object.entries(), Object.values() 라는 두 가지 메소드가 추가되었습니다.

이 메소드들은 객체를 배열로 변환한 다음 배열에서 사용할 수 있는 루프 메소드를 사용하여 해당 배열에 반복적으로 접근할 수 있게 해줍니다.

객체에 for…in 구문을 쓰지 않은 경우

자바스크립트의 객체는 map(), forEach(), for…of 등을 사용하여 루프할 수 없습니다.

다음과 같은 객체가 있다고 가정해 보겠습니다:

const items = {
    'first': new Date(),
    'second': 2,
    'third': 'test'
}

map() 메소드를 사용하면 다음과 같은 에러가 발생합니다:

for...in - 객체 map() 에러

forEach() 메소드도 위와 마찬가지 입니다:

for...in - 객체 forEach 에러

for…of 루프를 사용하면 반복할 수 없다는 에러가 발생합니다:

for...in - 객체 for...of 에러

Object.keys() 메소드

ES6 이전에는 객체를 루프 돌리는 유일한 방법은 for…in 구문을 사용하는 것 이었습니다. Object.keys() 메소드는 간단하게 객체 루프를 돌리도록 ES6 에서 추가되었습니다.

이 메소드에 루프 돌리고 싶은 객체를 매개변수로 전달하면 모든 속성 이름(key)을 가지는 배열을 리턴합니다.

리턴된 배열에 forEach()와 같은 배열 루프 메소드를 사용하면 각각의 속성에 해당하는 값을 얻을 수 있습니다.

const courses = {
    java: 10,
    javascript: 55,
    nodejs: 5,
    php: 15
};

const keys = Object.keys(courses);

console.log(keys);

keys.forEach((key, index) => {
    console.log(`${key}: ${courses[key]}`);
});
Object.keys() 메소드 예제

Object.values() 메소드

Object.values() 메소드는 ES8 에서 도입되었으며, Object.keys() 메소드와는 반대로 작동합니다.

이는 객체의 모든 속성 값을 배열로 리턴하고, 배열에 루프를 돌리면 값을 얻을 수 있습니다.

const animals = {
    tiger: 1,
    cat: 2,
    monkey: 3,
    elephant: 4
};

Object.values(animals).forEach(val => console.log(val));
Object.values() 메소드 예제

Object.entries() 메소드

또 다른 ES8 메소드인 Object.entries() 메소드는 key/value 쌍의 배열을 리턴해 루프를 돌 수 있습니다.

이 메소드는 각각 두 개의 요소를 가지는 다음과 같은 형식의 [[key, value], [key, value], [key, value], …] 배열의 배열을 리턴합니다.

다음은 실제 사용 예제입니다:

const animals = {
    tiger: 1,
    cat: 2,
    monkey: 3,
    elephant: 4
};

const entries = Object.entries(animals);
console.log(entries);
Object.entries() 메소드 예제

Object.entries()에서 리턴한 배열에 루프를 돌려면 다음과 같이 for…of 구문이나 forEach() 메소드를 사용할 수 있습니다:

// `for...of` loop
for (const [key, value] of Object.entries(animals)) {
    console.log(`${key}: ${value}`);
}

// `forEach()` method
Object.entries(animals).forEach(([key, value]) => {
    console.log(`${key}: ${value}`)
});
for...of, forEach() 비교

for…in 구문 정리

이 포스트에서는 자바스크립트 객체에서 루프를 도는 4 가지 방법에 대해 알아봤습니다.

오래된 브라우저를 사용하는 경우 for…in 구문을 사용할 수 밖에 없습니다. 하지만 최신 브라우저를 사용한다면 Object.entries() 같은 메소드를 사용하는 것이 더 좋습니다.

관련 글