💻
Code Snippet — July 30, 2026Flatten & 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...