Object.entries()로 객체 순회 리팩토링
배경
레거시 코드베이스에서 객체를 순회하며 key-value를 다루는 로직이 많았다. 대부분 Object.keys()를 사용하거나 for-in 루프를 돌렸는데, ES2017에 추가된 Object.entries()를 사용하면 더 깔끔하게 작성할 수 있다는 걸 알게 됐다.
기존 방식
const user = { name: 'John', age: 30, role: 'developer' };
// Object.keys() 사용
Object.keys(user).forEach(key => {
const value = user[key];
console.log(`${key}: ${value}`);
});
// for-in 사용
for (let key in user) {
if (user.hasOwnProperty(key)) {
console.log(`${key}: ${user[key]}`);
}
}
Object.entries() 적용
const user = { name: 'John', age: 30, role: 'developer' };
Object.entries(user).forEach(([key, value]) => {
console.log(`${key}: ${value}`);
});
// Map 변환도 간단
const userMap = new Map(Object.entries(user));
// 필터링과 조합
const filtered = Object.entries(user)
.filter(([key, value]) => typeof value === 'string')
.map(([key, value]) => `${key}: ${value}`);
실전 적용 사례
API 응답 데이터를 정규화하는 유틸 함수를 리팩토링했다.
// Before
function normalizeResponse(data) {
const result = {};
Object.keys(data).forEach(key => {
const value = data[key];
if (value !== null && value !== undefined) {
result[key] = value;
}
});
return result;
}
// After
function normalizeResponse(data) {
return Object.entries(data)
.filter(([_, value]) => value != null)
.reduce((acc, [key, value]) => ({ ...acc, [key]: value }), {});
}
주의사항
- IE11에서는 polyfill 필요
- Symbol 프로퍼티는 포함되지 않음
- 프로토타입 체인의 프로퍼티도 제외됨
배열 디스트럭처링과 함께 사용하면 가독성이 크게 향상된다. 앞으로 객체 순회 시 기본 선택지로 사용할 예정이다.