JSON Formatter & Validator3 min readOct 21, 2026

How to Flatten and Unflatten Deeply Nested JSON Objects in JavaScript

Learn how to transform deeply nested JSON objects into flat dot-notation key-value pairs for CSV export, analytics, and relational database indexing.

Direct Summary (TL;DR)

Flattening JSON converts deeply nested objects into a single-level dictionary using delimiter keys (e.g., user.address.geo.lat). This structure is essential for relational database indexing, BigQuery exports, and CSV table conversion without losing nested hierarchy.

Interactive Mickytool Utility

Solve this problem now with our free JSON Formatter & Validator

Try it instantly in your browser — zero tracking, 100% client-side privacy.

Open JSON Formatter & Validator

Specification & Architecture Reference

How to Flatten and Unflatten Deeply Nested JSON Objects in JavaScript — Technical Summary
Structure TypeHierarchy DepthPrimary Use Case
Nested HierarchyMulti-tier treeDocument stores (MongoDB, DynamoDB), REST APIs
Flattened Dot-Notation1-level key:valueCSV/Excel export, Form-data binding, Elasticsearch
Columnar TuplesFlat tabular schemaAnalytical data warehouses (BigQuery, Snowflake, ClickHouse)

The Challenge of Deeply Nested Payloads

Modern REST and GraphQL APIs commonly return objects nested 4 to 8 levels deep. While convenient for object-oriented programming, deep nesting creates architectural obstacles when: - Exporting customer records to flat CSV spreadsheets - Indexing document properties in search engines like Elasticsearch - Ingesting semi-structured records into relational SQL databases

Efficient Recursive Flattening in JavaScript

Here is a dependency-free, zero-copy flattening function that traverses objects and arrays recursively:

javascript
function flattenObject(obj, prefix = '', result = {}) {
  for (const [key, value] of Object.entries(obj)) {
    const newKey = prefix ? `${prefix}.${key}` : key;
    if (value !== null && typeof value === 'object' && !Array.isArray(value)) {
      flattenObject(value, newKey, result);
    } else {
      result[newKey] = value;
    }
  }
  return result;

// Example usage: const nested = { user: { profile: { name: "Alice", active: true } } }; console.log(flattenObject(nested)); // Outputs: { "user.profile.name": "Alice", "user.profile.active": true } ```

Unflattening Dot-Notation Back to Nested Trees

To restore a flattened object back to its original hierarchical structure:

javascript
function unflattenObject(data) {
  const result = {};
  for (const [key, value] of Object.entries(data)) {
    const keys = key.split('.');
    let current = result;
    keys.forEach((part, index) => {
      if (index === keys.length - 1) {
        current[part] = value;
      } else {
        current[part] = current[part] || {};
        current = current[part];
      }
    });
  }
  return result;
}

Need to validate, beautify, and inspect complex payloads before transforming them? Paste your data into Mickytool's **JSON Formatter & Validator** to inspect hierarchy levels and verify syntax structure in real time.

Interactive Mickytool Utility

Solve this problem now with our free JSON Formatter & Validator

Execute this workflow immediately without saving data on remote servers.

Open JSON Formatter & Validator

Frequently Asked Questions

How do you handle arrays when flattening JSON?

Arrays can either be preserved as literal array values at the key or indexed with numerical dot-notation (e.g., items.0.id, items.1.id).

Does flattening JSON mutate the original object?

Not if implemented with recursive cloning or pure functions as demonstrated above. Avoid modifying object prototypes during traversal.

Related Engineering Guides