중첩된 객체와 배열은 구조를 표현하기에는 좋지만, 스프레드시트나 로그, 번역 파일처럼 평평한 키-값 목록이 필요한 곳에서는 다루기 불편하다. Flatten(평탄화)은 바로 이 간극을 해결한다.
작동 방식
중첩된 필드 하나하나가 한 줄이 되며, 키는 값까지의 전체 경로(점이나 대괄호 인덱스로 표기)이고 값은 그대로의 값이다. {"user": {"address": {"city": "부산"}}}은 user.address.city → "부산" 쌍이 된다. 배열 요소는 경로 안에서 인덱스를 받는다. 예를 들어 items[0].name.
실제로 쓰이는 곳: 번역 파일(i18n)
점 표기법을 쓴 평평한 키는 i18next 같은 라이브러리의 번역 파일에서 표준적인 형식이다 — 중첩된 JSON 트리 대신 settings.profile.title 형태로 쓴다. 번역 플랫폼이나 스프레드시트 기반 워크플로는 거의 항상 이런 평평한 형식을 기대하므로, 중첩된 언어 파일을 평탄화하는 작업은 번역가에게 넘기기 전 첫 단계가 되는 경우가 많다.
실무에서 쓰이는 이유
- API에서 받은 중첩 데이터를 스프레드시트나 평평한 데이터베이스 테이블로 가져올 때.
- 복잡한 두 객체를 줄 단위로 비교하기 쉽게 만들 때.
- 깊게 중첩된 JSON에서 특정 값을, 전체 경로를 한눈에 보고 빠르게 찾을 때.
역연산: unflatten
평평한 목록에서 중첩 구조를 복원하려면 각 키를 경로 세그먼트로 분해(점과 대괄호 인덱스를 기준으로)하고, 중첩된 객체와 배열을 차례로 쌓아 올려야 한다. 경로가 두 가지 의미를 가질 수 있을 때 모호함이 생긴다 — 데이터에 문자 그대로의 키 "a.b"와 중첩된 경로 a.b가 동시에 있다면, unflatten은 어느 쪽을 의도했는지 추측할 수 없어 조용히 덮어쓰는 대신 충돌로 보고한다.