ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

es-toolkit 的 toConstantCaseKeys:将对象与数组的所有键递归转换为 CONSTANT_CASE

es-toolkit 的 toConstantCaseKeys:将对象与数组的所有键递归转换为 CONSTANT_CASE es-toolkit 的 toConstantCaseKeys将对象与数组的所有键递归转换为 CONSTANT_CASE【免费下载链接】es-toolkitA modern JavaScript utility library thats 2-3 times faster and up to 97% smaller, a major upgrade to lodash.项目地址: https://gitcode.com/GitHub_Trending/es/es-toolkit导读toConstantCaseKeys是 es-toolkit 提供的对象工具函数用于把对象包括数组内的对象以及任意层级的嵌套对象的所有键递归转换为 CONSTANT_CASE全大写、下划线分隔命名同时保持值不变。它在对接环境变量、配置文件、数据库列名或跨语言 API 等需要使用CONSTANT_CASE键名的场景中非常实用。读完本文你将掌握toConstantCaseKeys的完整用法、递归转换规则、运行时实现原理以及配套的 TypeScript 类型推导能力。CONSTANT_CASE 命名约定与函数定位CONSTANT_CASE 是一种将标识符中每个单词都用大写字母书写、并用下划线_连接的命名规则例如CONSTANT_CASE。toConstantCaseKeys接收一个对象返回一个包含相同属性、但所有键都被转换为 CONSTANT_CASE 格式的新对象const constantCased toConstantCaseKeys(obj);与toCamelCaseKeys、toKebabCaseKeys、toSnakeCaseKeys、toPascalCaseKeys等函数同属 es-toolkit 的键名转换家族见 src/object 目录下对应的源码文件该函数面向全部键统一大写、下划线分隔的转换需求。使用方式toConstantCaseKeys(obj)当你需要将对象的所有键转换为 CONSTANT_CASE 时使用本函数。嵌套对象与数组内的对象都会被递归转换。键的转换规则如下camelCase→CONSTANT_CASE例userId→USER_IDPascalCase→CONSTANT_CASE例UserId→USER_IDsnake_case→CONSTANT_CASE例first_name→FIRST_NAMElast→LASTimport { toConstantCaseKeys } from es-toolkit/object; // 基本对象转换 const obj { userId: 1, firstName: John, lastName: Doe }; const result toConstantCaseKeys(obj); // result 为 { USER_ID: 1, FIRST_NAME: John, LAST_NAME: Doe } // 数组内的对象也会被转换 const users [ { userId: 1, firstName: John }, { userId: 2, firstName: Jane }, ]; const convertedUsers toConstantCaseKeys(users); // convertedUsers 为 [{ USER_ID: 1, FIRST_NAME: John }, { USER_ID: 2, FIRST_NAME: Jane }] // 嵌套对象被完整转换 const nested { userData: { userId: 1, contactInfo: { emailAddress: johnexample.com, phoneNumber: 123-456-7890, }, }, }; const nestedResult toConstantCaseKeys(nested); // nestedResult 为 { // USER_DATA: { // USER_ID: 1, // CONTACT_INFO: { // EMAIL_ADDRESS: johnexample.com, // PHONE_NUMBER: 123-456-7890 // } // } // }参数objT要将其键转换为 CONSTANT_CASE 的对象、数组或原始值。返回值ToConstantCaseKeysT返回所有键都被转换为 CONSTANT_CASE 的新对象。源码级原理剖析递归转换的三个分支函数核心实现位于 src/object/toConstantCaseKeys.ts其逻辑按输入类型分为三个分支数组分支通过isArray判断后对数组的每个元素递归调用自身保证数组内对象的键也被转换普通对象分支通过isPlainObject判断后遍历Object.keys用constantCase(key)生成新的常量键并对每个值递归转换后写入结果对象其余情况原始值、非普通对象直接原样返回保证number、string、null、undefined、boolean等原始值不被破坏。在对象分支中键的转换委托给字符串工具 src/string/constantCase.ts先用words函数按单词边界拆分字符串再将每个单词toUpperCase()后用_连接。而单词拆分依赖 src/string/words.ts 中的CASE_SPLIT_PATTERN正则/\p{Lu}?\p{Ll}|[0-9]|\p{Lu}(?!\p{Ll})|\p{Emoji_Presentation}|\p{Extended_Pictographic}|\p{L}/gu它能够识别驼峰、蛇形、连字符、缩写如HTTPRequest→HTTP_REQUEST乃至 Emoji 与 Unicode 字符的边界。原值保持与非普通对象旁路值得注意的实现细节是转换只发生在**普通对象plain object**上。isPlainObject的判断意味着Date、RegExp、Map等内置对象实例不会被当作需要转换键的普通对象而是原样透传。测试 src/object/toConstantCaseKeys.spec.ts 验证了{ a: new Date(), b: /test/, c: new Map() }这类输入在转换后其值仍是Date、RegExp、Map类型键a、b、c被转换为A、B、C而值本身未被递归改写。边界行为由测试用例验证src/object/toConstantCaseKeys.spec.ts 覆盖了以下关键行为可直接作为行为契约参考扁平对象的 camelCase 键转换L5-L9嵌套对象递归转换L11-L31对象数组转换L33-L43与对象内的数组转换L45-L59原始值不被修改123、string、null、undefined、true均原样返回L61-L67空对象与空数组返回空结果L69-L72保留对象原型上的方法toString会被转换为TO_STRING且函数引用不变L74-L80snake_case 键在运行时与类型层面都被正确转换L136-L153。类型层面的推导ToConstantCaseKeysTtoConstantCaseKeys的返回类型由 src/types/ToConstantCaseKeys.ts 中的条件类型递归推导若类型是NonPlainObject见 src/_internal/NonPlainObject.ts包含Date、RegExp、Map、Set、Promise、Error、ArrayBuffer、各类 TypedArray、函数与globalThis则原样返回若是数组类型则映射为元素类型递归转换后的数组若是Recordstring, any则通过ConstantCasestring K在类型层把每个键重写为常量形式并递归转换值的类型其余类型如原始值直接透传。因此嵌套结构与数组在编译期即可获得完整类型提示。测试用例L82-L125分别验证了嵌套对象USER_DATA.PERSONAL_INFO.FIRST_NAME、对象数组Array{ USER_ID: number }以及混合复杂结构USERS: Array{ USER_ID: number; SETTINGS: { IS_ACTIVE: boolean } }的类型推导结果。这意味着在编写代码时访问result.USER_ID等常量键名即可获得自动补全与类型检查。典型应用场景与注意事项环境变量/配置键对齐当你的代码使用 camelCase 对象而外部配置或环境要求全大写下划线键名如API_BASE_URL时可用一次调用完成键名统一数据序列化适配在将对象输出为某些后端协议、数据库列名或跨语言接口要求的常量键格式前直接转换整个对象树注意非普通对象透传Date、Map、RegExp等内置对象实例不会被递归改写这通常是你期望的安全行为注意键名冲突不同原始键如userId与user_id可能转换为相同的USER_ID转换时后者会覆盖前者使用时需自行确认数据中不存在此类冲突不可变性函数返回新对象不会修改原始输入。该函数与toCamelCaseKeys等其他键转换工具一样可通过import { toConstantCaseKeys } from es-toolkit/object按需引入已在 src/object/index.ts 中导出便于打包器进行 tree-shaking。【免费下载链接】es-toolkitA modern JavaScript utility library thats 2-3 times faster and up to 97% smaller, a major upgrade to lodash.项目地址: https://gitcode.com/GitHub_Trending/es/es-toolkit创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表