interface Config { exclude?: string[]; } type FormatObjKeyType = 'firstUpperCase' | 'firstLowerCase'; export function formatObjKey(obj: any, type: FormatObjKeyType, options?: Config) { if (obj === null || typeof obj !== 'object') { return obj; } let o: any; if (Array.isArray(obj)) { o = []; for (let i = 0; i < obj.length; i++) { o.push(formatObjKey(obj[i], type, options)); } } else { o = {}; Object.keys(obj).forEach(key => { o[handelFormat(key, type, options)] = formatObjKey(obj[key], type, options); }); } return o; } function handelFormat(key: string, type: FormatObjKeyType, options?: Config) { if (options && options.exclude && options.exclude.includes(key)) return key; if (type === 'firstUpperCase') { key = key.replace(/^./, (_: string) => _.toUpperCase()); } else if (type === 'firstLowerCase') { key = key.replace(/^./, (_: string) => _.toLowerCase()); } return key; }