Path: blob/main/replay/frontend/src/pages/output/flattenJson.ts
1030 views
export interface FlatJson extends FlattenJsonOptions {1id?: number;2content: string;3level: number;4highlighted?: boolean;5scrollIntoView?: boolean;6path: string;7}89interface FlattenJsonOptions {10key?: string;11index?: number;12showComma?: boolean;13type?: string;14isContent?: boolean;15}1617export default function flattenJson(18data: any,19path = '',20level = 0,21options: FlattenJsonOptions = {},22): FlatJson[] {23const { key, index, showComma = false } = options;24const type = Object.prototype.toString.call(data).slice(8, -1).toLowerCase();2526if (typeof data === 'object') {27const isArray = type === 'array';2829const results: FlatJson[] = [30{31content: isArray ? '[' : '{',32level,33key,34path,35},36];37const keys = Object.keys(data);3839for (let idx = 0; idx < keys.length; idx += 1) {40const objKey = isArray ? idx : keys[idx];41let childPath = `${path}.${objKey}`;42if (isArray) childPath = path ? `${path}.[${objKey}]` : `[${objKey}]`;43else if ((objKey as string).includes('.')) {44childPath = `${path}["${objKey}"]`;45}4647const flattenJsonOptions: FlattenJsonOptions = {48showComma: idx !== keys.length - 1,49isContent: true,50};51if (isArray) {52flattenJsonOptions.index = idx;53} else {54flattenJsonOptions.key = objKey as string;55}56const childRecords = flattenJson(data[objKey], childPath, level + 1, flattenJsonOptions);57results.push(...childRecords);58}5960results.push({61content: isArray ? ']' : '}',62showComma,63level,64path,65});66return results;67}6869const output: FlatJson = {70content: data,71level,72key,73index,74path,75showComma,76isContent: true,77type,78};7980return [output];81}828384