Skip to content

upperize

将对象的所有键名转换为大写,递归处理嵌套对象。

基础用法

typescript
import { upperize } from 'radash'

const obj = { name: 'Alice', age: 25, city: 'Beijing' }
const upperized = upperize(obj)
console.log(upperized) // { NAME: 'Alice', AGE: 25, CITY: 'Beijing' }

语法

typescript
function upperize<T extends Record<string, any>>(obj: T): Record<string, any>

参数

  • obj (T): 要转换键名的对象

返回值

返回键名转换为大写的新对象,递归处理嵌套对象。

示例

基本键名转换

typescript
import { upperize } from 'radash'

const obj = { name: 'Alice', age: 25, city: 'Beijing' }

const upperized = upperize(obj)
console.log(upperized) // { NAME: 'Alice', AGE: 25, CITY: 'Beijing' }

处理嵌套对象

typescript
import { upperize } from 'radash'

const obj = {
  user: {
    name: 'Alice',
    profile: {
      email: 'alice@example.com',
      settings: {
        theme: 'dark',
        language: 'en'
      }
    }
  },
  settings: {
    theme: 'light',
    notifications: true
  }
}

const upperized = upperize(obj)
console.log(upperized)
// {
//   USER: {
//     NAME: 'Alice',
//     PROFILE: {
//       EMAIL: 'alice@example.com',
//       SETTINGS: {
//         THEME: 'dark',
//         LANGUAGE: 'en'
//       }
//     }
//   },
//   SETTINGS: {
//     THEME: 'light',
//     NOTIFICATIONS: true
//   }
// }

处理数组值

typescript
import { upperize } from 'radash'

const obj = {
  users: [
    { name: 'Alice', age: 25 },
    { name: 'Bob', age: 30 }
  ],
  settings: {
    colors: ['red', 'blue', 'green'],
    numbers: [1, 2, 3, 4, 5]
  }
}

const upperized = upperize(obj)
console.log(upperized)
// {
//   USERS: [
//     { NAME: 'Alice', AGE: 25 },
//     { NAME: 'Bob', AGE: 30 }
//   ],
//   SETTINGS: {
//     COLORS: ['red', 'blue', 'green'],
//     NUMBERS: [1, 2, 3, 4, 5]
//   }
// }

处理函数值

typescript
import { upperize } from 'radash'

const obj = {
  handlers: {
    userHandler: () => 'hello',
    emailValidator: function() { return true },
    dataProcessor: (x: number) => x * 2
  },
  callbacks: {
    onSuccess: () => console.log('success'),
    onError: (err: Error) => console.error(err)
  }
}

const upperized = upperize(obj)
console.log(upperized)
// {
//   HANDLERS: {
//     USERHANDLER: [Function: userHandler],
//     EMAILVALIDATOR: [Function: emailValidator],
//     DATAPROCESSOR: [Function: dataProcessor]
//   },
//   CALLBACKS: {
//     ONSUCCESS: [Function: onSuccess],
//     ONERROR: [Function: onError]
//   }
// }

处理日期值

typescript
import { upperize } from 'radash'

const obj = {
  timestamps: {
    createdAt: new Date('2023-01-01'),
    updatedAt: new Date('2023-12-31'),
    deletedAt: null
  },
  events: {
    startDate: new Date('2024-01-01'),
    endDate: new Date('2024-12-31')
  }
}

const upperized = upperize(obj)
console.log(upperized)
// {
//   TIMESTAMPS: {
//     CREATEDAT: 2023-01-01T00:00:00.000Z,
//     UPDATEDAT: 2023-12-31T00:00:00.000Z,
//     DELETEDAT: null
//   },
//   EVENTS: {
//     STARTDATE: 2024-01-01T00:00:00.000Z,
//     ENDDATE: 2024-12-31T00:00:00.000Z
//   }
// }

处理布尔值

typescript
import { upperize } from 'radash'

const obj = {
  flags: {
    isActive: true,
    isVerified: false,
    isPremium: true,
    isBlocked: false
  },
  settings: {
    enableNotifications: true,
    enableDebug: false,
    enableLogging: true
  }
}

const upperized = upperize(obj)
console.log(upperized)
// {
//   FLAGS: {
//     ISACTIVE: true,
//     ISVERIFIED: false,
//     ISPREMIUM: true,
//     ISBLOCKED: false
//   },
//   SETTINGS: {
//     ENABLENOTIFICATIONS: true,
//     ENABLEDEBUG: false,
//     ENABLELOGGING: true
//   }
// }

处理数字值

typescript
import { upperize } from 'radash'

const obj = {
  scores: {
    mathScore: 95,
    englishScore: 88,
    scienceScore: 92
  },
  prices: {
    basePrice: 99.99,
    discountPrice: 79.99,
    taxAmount: 8.99
  }
}

const upperized = upperize(obj)
console.log(upperized)
// {
//   SCORES: {
//     MATHSCORE: 95,
//     ENGLISHSCORE: 88,
//     SCIENCESCORE: 92
//   },
//   PRICES: {
//     BASEPRICE: 99.99,
//     DISCOUNTPRICE: 79.99,
//     TAXAMOUNT: 8.99
//   }
// }

处理API响应数据

typescript
import { upperize } from 'radash'

const apiResponse = {
  responseData: {
    userId: 1,
    userName: 'Alice',
    userEmail: 'alice@example.com',
    userProfile: {
      firstName: 'Alice',
      lastName: 'Smith',
      age: 25
    }
  },
  responseMeta: {
    timestamp: new Date(),
    requestId: 'req_123456',
    version: 'v1.0.0'
  }
}

const upperized = upperize(apiResponse)
console.log(upperized)
// {
//   RESPONSEDATA: {
//     USERID: 1,
//     USERNAME: 'Alice',
//     USEREMAIL: 'alice@example.com',
//     USERPROFILE: {
//       FIRSTNAME: 'Alice',
//       LASTNAME: 'Smith',
//       AGE: 25
//     }
//   },
//   RESPONSEMETA: {
//     TIMESTAMP: 2023-12-31T12:00:00.000Z,
//     REQUESTID: 'req_123456',
//     VERSION: 'v1.0.0'
//   }
// }

处理表单数据

typescript
import { upperize } from 'radash'

const formData = {
  personalInfo: {
    firstName: 'Alice',
    lastName: 'Smith',
    emailAddress: 'alice@example.com',
    phoneNumber: '123-456-7890'
  },
  addressInfo: {
    streetAddress: '123 Main St',
    cityName: 'Beijing',
    countryCode: 'CN',
    zipCode: '10001'
  }
}

const upperized = upperize(formData)
console.log(upperized)
// {
//   PERSONALINFO: {
//     FIRSTNAME: 'Alice',
//     LASTNAME: 'Smith',
//     EMAILADDRESS: 'alice@example.com',
//     PHONENUMBER: '123-456-7890'
//   },
//   ADDRESSINFO: {
//     STREETADDRESS: '123 Main St',
//     CITYNAME: 'Beijing',
//     COUNTRYCODE: 'CN',
//     ZIPCODE: '10001'
//   }
// }

处理配置对象

typescript
import { upperize } from 'radash'

const config = {
  serverConfig: {
    hostName: 'localhost',
    portNumber: 3000,
    enableSSL: true,
    timeoutMs: 5000
  },
  databaseConfig: {
    connectionURL: 'postgresql://localhost:5432/mydb',
    poolSettings: {
      minConnections: 1,
      maxConnections: 10,
      idleTimeout: 30000
    }
  },
  apiConfig: {
    versionNumber: 'v1',
    rateLimitSettings: {
      windowMs: 900000,
      maxRequests: 100
    }
  }
}

const upperized = upperize(config)
console.log(upperized)
// {
//   SERVERCONFIG: {
//     HOSTNAME: 'localhost',
//     PORTNUMBER: 3000,
//     ENABLESSL: true,
//     TIMEOUTMS: 5000
//   },
//   DATABASECONFIG: {
//     CONNECTIONURL: 'postgresql://localhost:5432/mydb',
//     POOLSETTINGS: {
//       MINCONNECTIONS: 1,
//       MAXCONNECTIONS: 10,
//       IDLETIMEOUT: 30000
//     }
//   },
//   APICONFIG: {
//     VERSIONNUMBER: 'v1',
//     RATELIMITSETTINGS: {
//       WINDOWMS: 900000,
//       MAXREQUESTS: 100
//     }
//   }
// }

处理错误对象

typescript
import { upperize } from 'radash'

const errorObject = {
  errorName: 'ValidationError',
  errorMessage: 'Invalid input',
  errorDetails: {
    fieldName: 'email',
    fieldValue: 'invalid-email',
    validationConstraints: {
      format: 'Must be a valid email',
      required: true
    }
  },
  errorCode: 'VALIDATION_FAILED'
}

const upperized = upperize(errorObject)
console.log(upperized)
// {
//   ERRORNAME: 'ValidationError',
//   ERRORMESSAGE: 'Invalid input',
//   ERRORDETAILS: {
//     FIELDNAME: 'email',
//     FIELDVALUE: 'invalid-email',
//     VALIDATIONCONSTRAINTS: {
//       FORMAT: 'Must be a valid email',
//       REQUIRED: true
//     }
//   },
//   ERRORCODE: 'VALIDATION_FAILED'
// }

处理日志数据

typescript
import { upperize } from 'radash'

const logEntry = {
  logTimestamp: new Date(),
  logLevel: 'ERROR',
  logMessage: 'Database connection failed',
  logContext: {
    userId: 123,
    requestId: 'req_456',
    sessionId: 'sess_789'
  },
  errorInfo: {
    errorCode: 'ECONNREFUSED',
    errorMessage: 'Connection refused',
    stackTrace: 'Error: Connection refused...'
  }
}

const upperized = upperize(logEntry)
console.log(upperized)
// {
//   LOGTIMESTAMP: 2023-12-31T12:00:00.000Z,
//   LOGLEVEL: 'ERROR',
//   LOGMESSAGE: 'Database connection failed',
//   LOGCONTEXT: {
//     USERID: 123,
//     REQUESTID: 'req_456',
//     SESSIONID: 'sess_789'
//   },
//   ERRORINFO: {
//     ERRORCODE: 'ECONNREFUSED',
//     ERRORMESSAGE: 'Connection refused',
//     STACKTRACE: 'Error: Connection refused...'
//   }
// }

处理数据库查询结果

typescript
import { upperize } from 'radash'

const dbResult = {
  recordID: 1,
  productName: 'Product A',
  categoryInfo: {
    categoryID: 5,
    categoryName: 'Electronics',
    categoryDescription: 'Electronic products'
  },
  productVariants: [
    { variantID: 101, colorName: 'Red', priceValue: 99.99 },
    { variantID: 102, colorName: 'Blue', priceValue: 89.99 }
  ],
  metadata: {
    createdAt: new Date(),
    updatedAt: new Date(),
    versionNumber: '1.0.0'
  }
}

const upperized = upperize(dbResult)
console.log(upperized)
// {
//   RECORDID: 1,
//   PRODUCTNAME: 'Product A',
//   CATEGORYINFO: {
//     CATEGORYID: 5,
//     CATEGORYNAME: 'Electronics',
//     CATEGORYDESCRIPTION: 'Electronic products'
//   },
//   PRODUCTVARIANTS: [
//     { VARIANTID: 101, COLORNAME: 'Red', PRICEVALUE: 99.99 },
//     { VARIANTID: 102, COLORNAME: 'Blue', PRICEVALUE: 89.99 }
//   ],
//   METADATA: {
//     CREATEDAT: 2023-12-31T12:00:00.000Z,
//     UPDATEDAT: 2023-12-31T12:00:00.000Z,
//     VERSIONNUMBER: '1.0.0'
//   }
// }

处理空对象和边界情况

typescript
import { upperize } from 'radash'

// 空对象
console.log(upperize({})) // {}

// 只有一个键值对
console.log(upperize({ key: 'value' })) // { KEY: 'value' }

// 包含空值
console.log(upperize({ a: 1, b: null, c: undefined }))
// { A: 1, B: null, C: undefined }

// 包含特殊字符的键名
console.log(upperize({ 'user-name': 'Alice', 'email@domain': 'test' }))
// { 'USER-NAME': 'Alice', 'EMAIL@DOMAIN': 'test' }

处理复杂嵌套对象

typescript
import { upperize } from 'radash'

const complexObj = {
  userProfile: {
    personalInfo: {
      fullName: 'Alice Smith',
      ageValue: 25,
      contactDetails: {
        emailAddress: 'alice@example.com',
        phoneNumber: '123-456-7890'
      }
    },
    userSettings: {
      themePreference: 'dark',
      notificationSettings: {
        emailNotifications: true,
        pushNotifications: false,
        smsNotifications: true
      }
    }
  },
  systemInfo: {
    versionNumber: '1.0.0',
    environmentType: 'production',
    buildInfo: {
      buildNumber: '12345',
      buildDate: new Date(),
      commitHash: 'abc123def456'
    }
  }
}

const upperized = upperize(complexObj)
console.log(upperized)
// {
//   USERPROFILE: {
//     PERSONALINFO: {
//       FULLNAME: 'Alice Smith',
//       AGEVALUE: 25,
//       CONTACTDETAILS: {
//         EMAILADDRESS: 'alice@example.com',
//         PHONENUMBER: '123-456-7890'
//       }
//     },
//     USERSETTINGS: {
//       THEMEPREFERENCE: 'dark',
//       NOTIFICATIONSETTINGS: {
//         EMAILNOTIFICATIONS: true,
//         PUSHNOTIFICATIONS: false,
//         SMSNOTIFICATIONS: true
//       }
//     }
//   },
//   SYSTEMINFO: {
//     VERSIONNUMBER: '1.0.0',
//     ENVIRONMENTTYPE: 'production',
//     BUILDINFO: {
//       BUILDNUMBER: '12345',
//       BUILDDATE: 2023-12-31T12:00:00.000Z,
//       COMMITHASH: 'abc123def456'
//     }
//   }
// }

处理枚举映射

typescript
import { upperize } from 'radash'

const statusMap = {
  userStatus: {
    activeStatus: 'ACTIVE',
    inactiveStatus: 'INACTIVE',
    pendingStatus: 'PENDING',
    suspendedStatus: 'SUSPENDED'
  },
  orderStatus: {
    pendingOrder: 'PENDING',
    confirmedOrder: 'CONFIRMED',
    shippedOrder: 'SHIPPED',
    deliveredOrder: 'DELIVERED'
  }
}

const upperized = upperize(statusMap)
console.log(upperized)
// {
//   USERSTATUS: {
//     ACTIVESTATUS: 'ACTIVE',
//     INACTIVESTATUS: 'INACTIVE',
//     PENDINGSTATUS: 'PENDING',
//     SUSPENDEDSTATUS: 'SUSPENDED'
//   },
//   ORDERSTATUS: {
//     PENDINGORDER: 'PENDING',
//     CONFIRMEDORDER: 'CONFIRMED',
//     SHIPPEDORDER: 'SHIPPED',
//     DELIVEREDORDER: 'DELIVERED'
//   }
// }

处理颜色映射

typescript
import { upperize } from 'radash'

const colorMap = {
  primaryColors: {
    primaryRed: '#FF0000',
    primaryBlue: '#0000FF',
    primaryGreen: '#00FF00'
  },
  secondaryColors: {
    secondaryYellow: '#FFFF00',
    secondaryPurple: '#800080',
    secondaryOrange: '#FFA500'
  }
}

const upperized = upperize(colorMap)
console.log(upperized)
// {
//   PRIMARYCOLORS: {
//     PRIMARYRED: '#FF0000',
//     PRIMARYBLUE: '#0000FF',
//     PRIMARYGREEN: '#00FF00'
//   },
//   SECONDARYCOLORS: {
//     SECONDARYYELLOW: '#FFFF00',
//     SECONDARYPURPLE: '#800080',
//     SECONDARYORANGE: '#FFA500'
//   }
// }

注意事项

  1. 递归处理: 递归处理所有嵌套对象
  2. 数组处理: 数组内的对象也会被处理
  3. 不可变性: 返回新对象,不修改原对象
  4. 类型安全: 支持TypeScript类型推断
  5. 特殊字符: 保留键名中的特殊字符(如连字符、下划线等)

与其他方法的区别

  • Object.keys(): 获取对象的所有键
  • upperize(): 将键名转换为大写
  • lowerize(): 将键名转换为小写
  • mapKeys(): 自定义键名映射

实际应用场景

  1. 数据标准化: 统一对象键名的格式
  2. API适配: 适配需要大写键名的API
  3. 数据库映射: 映射数据库字段名
  4. 配置处理: 处理配置对象的键名格式
  5. 数据转换: 将键名转换为大写或小写

Released under the MIT License.