如何用JavaScript、Ramda、TypeScript将对象camelCase键转为snake_case
将camelCase键的对象转换为snake_case键的对象
你已经实现了单个字符串的camelCase转snakeCase函数,接下来只需要遍历对象的所有键,对每个键应用这个转换函数,再重新构建一个新对象即可。
基础版本(适用于扁平对象)
直接利用Object.entries和Object.fromEntries快速处理:
const camelToSnakeCase = str => str.replace(/[A-Z]/g, letter => `_${letter.toLowerCase()}`); // 转换对象键的核心函数 const convertToSnakeCaseObj = obj => { return Object.fromEntries( Object.entries(obj).map(([key, value]) => [camelToSnakeCase(key), value]) ); }; // 测试示例 const camelCaseObj = { "studentName": "ABC", "studentId": "12345", "age": 18, "submittedAt": "xxxxxx" }; const snakeCaseObj = convertToSnakeCaseObj(camelCaseObj); console.log(snakeCaseObj); // 输出:{ student_name: 'ABC', student_id: '12345', age: 18, submitted_at: 'xxxxxx' }
进阶版本(支持嵌套对象/数组)
如果你的对象包含嵌套对象或者数组,需要添加递归逻辑处理每个层级的键:
const camelToSnakeCase = str => str.replace(/[A-Z]/g, letter => `_${letter.toLowerCase()}`); const convertToSnakeCaseObj = obj => { // 处理数组:递归转换数组中的每个元素 if (Array.isArray(obj)) { return obj.map(item => convertToSnakeCaseObj(item)); } // 处理对象:递归转换对象的每个键和值 if (obj && typeof obj === 'object') { return Object.fromEntries( Object.entries(obj).map(([key, value]) => [ camelToSnakeCase(key), convertToSnakeCaseObj(value) ]) ); } // 非对象/数组类型直接返回原值 return obj; }; // 测试嵌套对象示例 const nestedCamelObj = { studentName: "ABC", studentId: "12345", age: 18, submittedAt: "xxxxxx", courseInfo: { courseName: "Math", courseCode: "MATH101" }, scores: [ { subjectName: "English", score: 90 }, { subjectName: "Science", score: 85 } ] }; const nestedSnakeObj = convertToSnakeCaseObj(nestedCamelObj); console.log(nestedSnakeObj);
简单原理说明
Object.entries(obj):把对象拆解成[键, 值]格式的数组,方便遍历操作。map(([key, value]) => [...]):遍历每个键值对,用你写的函数转换键名,保留原始值。Object.fromEntries(...):把处理后的键值对数组重新组装成对象。- 递归逻辑:遇到数组或嵌套对象时,重复执行转换逻辑,确保所有层级的键都被处理。
内容的提问来源于stack exchange,提问作者franco phong
相关产品推荐
相关产品推荐

