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'
// }
// }
注意事項
- 遞歸處理: 遞歸處理所有嵌套對象
- 數組處理: 數組內的對象也會被處理
- 不可變性: 返回新對象,不修改原對象
- 類型安全: 支持TypeScript類型推斷
- 特殊字符: 保留鍵名中的特殊字符(如連字符、下劃線等)
與其他方法的區別
Object.keys()
: 獲取對象的所有鍵upperize()
: 將鍵名轉換為大寫lowerize()
: 將鍵名轉換為小寫mapKeys()
: 自定義鍵名映射
實際應用場景
- 數據標准化: 統一對象鍵名的格式
- API適配: 適配需要大寫鍵名的API
- 數據庫映射: 映射數據庫字段名
- 配置處理: 處理配置對象的鍵名格式
- 數據轉換: 將鍵名轉換為大寫或小寫