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.