Object.entries()와 Object.fromEntries()로 객체 변환하기
배경
레거시 API 응답 데이터를 정제하는 작업을 하다가 객체의 특정 프로퍼티만 필터링해야 하는 상황이 생겼다. Object.keys()만 사용하던 기존 방식보다 Object.entries()를 활용하면 더 간결하게 처리할 수 있었다.
Object.entries() 기본
ES2017에 추가된 메서드로, 객체를 [key, value] 쌍의 배열로 변환한다.
const user = {
id: 123,
name: 'John',
email: '[email protected]',
password: 'hashed_value'
};
const entries = Object.entries(user);
// [['id', 123], ['name', 'John'], ['email', '[email protected]'], ['password', 'hashed_value']]
실무 활용: 민감 정보 필터링
클라이언트로 전달할 때 password 같은 필드를 제거해야 했다.
const sanitizeUser = (user) => {
return Object.entries(user)
.filter(([key]) => key !== 'password')
.reduce((acc, [key, value]) => {
acc[key] = value;
return acc;
}, {});
};
const sanitized = sanitizeUser(user);
// { id: 123, name: 'John', email: '[email protected]' }
값 변환
모든 문자열 값을 트림하는 경우:
const trimValues = (obj) => {
return Object.entries(obj)
.map(([key, value]) => [
key,
typeof value === 'string' ? value.trim() : value
])
.reduce((acc, [key, value]) => {
acc[key] = value;
return acc;
}, {});
};
한계
Object.fromEntries()가 아직 제안 단계(Stage 3)라 reduce를 사용해 객체로 복원해야 한다. 내년쯤 되면 표준에 포함될 것 같다.
정리
- 객체 → 배열 변환으로 filter, map 활용 가능
- 불변성 유지에 유리
- reduce로 객체 복원이 다소 번거로움