Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 | 1x 1x 10x 10x 9x 9x 2x 2x 7x 7x 15x 15x 8x 7x 7x 1x 1x 1x 1x 9x 9x 9x 9x 23x 1x | // stackoverflow.com/questions/44134212/best-way-to-flatten-js-object-keys-and-values-to-a-single-depth-array
export function flattenObject(
obj: Record<string, unknown>,
options?: {
separator?: string;
}
) {
const defaultOptions = {
separator: '.',
...(options || {}),
};
function flt(
obj: any,
prefix = '',
result: null | Record<string, unknown> = null
) {
result = result || {};
// Preserve empty objects and arrays, they are lost otherwise
if (
prefix &&
typeof obj === 'object' &&
obj !== null &&
Object.keys(obj).length === 0
) {
result[prefix] = Array.isArray(obj) ? [] : {};
return result;
}
prefix = prefix ? prefix + `${defaultOptions.separator}` : '';
for (const i in obj) {
Eif (Object.prototype.hasOwnProperty.call(obj, i)) {
if (typeof obj[i] === 'object' && obj[i] !== null) {
// Recursion on deeper objects
flt(obj[i], prefix + i, result);
} else {
result[prefix + i] = obj[i];
}
}
}
return result;
}
return flt(obj);
}
export function unFlattenObject(obj: Record<string, unknown>) {
const result = {};
for (const i in obj) {
Eif (Object.prototype.hasOwnProperty.call(obj, i)) {
const keys = i.match(/^\.+[^.]*|[^.]*\.+$|(?:\.{2,}|[^.])+(?:\.+$)?/g); // Just a complicated regex to only match a single dot in the middle of the string
Iif (keys == null) return result;
keys.reduce((r: any, e, j) => {
return (
r[e] ||
(r[e] = isNaN(Number(keys[j + 1]))
? keys.length - 1 === j
? obj[i]
: {}
: [])
);
}, result);
}
}
return result;
}
|