Files
umami/src/lib/data.ts
T
JLUpengjiaji f6703d3d6d refactor(data): 重构 JSON 扁平化函数并添加测试
- 将 flattenJSON 重构为更简洁的递归实现
- 提取 KeyValueData 接口并导出 createKeyValue 函数
- 添加完整的单元测试覆盖所有功能
2026-04-29 15:04:08 +08:00

86 lines
2.0 KiB
TypeScript

import { DATA_TYPE, DATETIME_REGEX } from './constants';
import type { DynamicDataType } from './types';
export interface KeyValueData {
key: string;
value: any;
dataType: DynamicDataType;
}
export function flattenJSON(eventData: Record<string, any>): KeyValueData[] {
function flatten(obj: Record<string, any>, parentKey: string): KeyValueData[] {
return Object.entries(obj).flatMap(([key, value]) => {
const fullKey = parentKey ? `${parentKey}.${key}` : key;
if (value && typeof value === 'object' && !Array.isArray(value) && !isValidDateValue(value)) {
return flatten(value, fullKey);
}
return [createKeyValue(fullKey, value)];
});
}
return flatten(eventData, '');
}
export function isValidDateValue(value: string) {
return typeof value === 'string' && DATETIME_REGEX.test(value);
}
export function getDataType(value: any): string {
let type: string = typeof value;
if (isValidDateValue(value)) {
type = 'date';
}
return type;
}
export function getStringValue(value: string, dataType: number) {
if (dataType === DATA_TYPE.number) {
return parseFloat(value).toFixed(4);
}
if (dataType === DATA_TYPE.date) {
return new Date(value).toISOString();
}
return value;
}
export function createKeyValue(key: string, value: any): KeyValueData {
const type = getDataType(value);
let dataType: DynamicDataType;
let processedValue = value;
switch (type) {
case 'number':
dataType = DATA_TYPE.number;
break;
case 'string':
dataType = DATA_TYPE.string;
break;
case 'boolean':
dataType = DATA_TYPE.boolean;
processedValue = value ? 'true' : 'false';
break;
case 'date':
dataType = DATA_TYPE.date;
break;
case 'object':
dataType = DATA_TYPE.array;
processedValue = JSON.stringify(value);
break;
default:
dataType = DATA_TYPE.string;
break;
}
return { key, value: processedValue, dataType };
}
export function objectToArray(obj: object) {
return Object.keys(obj).map(key => obj[key]);
}