← Back to Blog
Code Snippets July 30, 2026

Flatten & Unflatten Nested Objects (JavaScript)

💻 Code Snippet — July 30, 2026

Flatten & Unflatten Nested Objects (JavaScript)

Tired of writing recursive helpers that break on arrays, Dates, or null? Zero-dependency ES2020+.

function flatten(obj, {prefix='', delimiter='.', maxDepth=Infinity, currentDepth=0, filter=null} = {}) {
  if (currentDepth >= maxDepth || obj === null || obj === undefined ||
      obj instanceof Date || obj instanceof RegExp ||
      obj instanceof Map || obj instanceof Set || typeof obj !== 'object') {
    const key = prefix || '0';
    return (filter ? filter(key) : true) ? { [key]: obj } : {};
  }
  const result = {};
  for (const [key, value] of Object.entries(obj)) {
    const newKey = prefix ? `${prefix}${delimiter}${key}` : key;
    if (value !== null && typeof value === 'object') {
      Object.assign(result, flatten(value, {prefix: newKey, delimiter, maxDepth, currentDepth: currentDepth + 1, filter}));
    } else {
      if (filter ? filter(newKey) : true) result[newKey] = value;
    }
  }
  return result;
}

function unflatten(obj, {delimiter='.', typeMap={}} = {}) {
  const result = {};
  for (const flatKey of Object.keys(obj).sort((a,b) => a.split(delimiter).length - b.split(delimiter).length)) {
    let value = obj[flatKey];
    const parts = flatKey.split(delimiter);
    let current = result;
    for (let i = 0; i < parts.length - 1; i++) {
      const nextIsNumeric = /^\d+$/.test(parts[i + 1]);
      if (!(parts[i] in current) || typeof current[parts[i]] !== 'object' || current[parts[i]] === null)
        current[parts[i]] = nextIsNumeric ? [] : {};
      current = current[parts[i]];
    }
    const last = parts[parts.length - 1];
    current[last] = /^\d+$/.test(last) && Array.isArray(current) ? (current[parseInt(last)] = value, value) : (current[last] = value);
  }
  return result;
}


Features:
  • Arrays via indexed keys: users.0.name ↔ users: [{name}]

  • Type preservation: Dates, RegExp, Maps, Sets stay intact

  • **Pat...