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로 객체 복원이 다소 번거로움