JavaScript:将对象字符串属性名转为非字符串形式(不可改原对象)
解决方案
要把对象中带连字符的字符串属性名转成下划线格式的非字符串属性名,同时不修改原对象,可以写一个递归处理函数生成新对象:
基础版(仅处理对象)
function transformObjectKeys(obj) { // 非对象类型直接返回原值 if (typeof obj !== 'object' || obj === null) { return obj; } const transformedObj = {}; // 遍历原对象所有键 Object.keys(obj).forEach(key => { // 将连字符替换为下划线,生成新键名 const newKey = key.replace(/-/g, '_'); // 递归处理嵌套对象,赋值给新对象 transformedObj[newKey] = transformObjectKeys(obj[key]); }); return transformedObj; } // 使用示例(把axios返回的对象直接传入即可) const originalObj = { id: 1, name: { "english-us": "John", "english-uk": "John", "italian-eu": "Giovanni", }, }; const transformedObj = transformObjectKeys(originalObj); console.log(transformedObj);
扩展版(支持数组嵌套)
如果接口返回的对象里包含数组,且数组内也有需要处理的对象,可以扩展函数支持数组:
function transformObjectKeys(obj) { if (typeof obj !== 'object' || obj === null) { return obj; } // 处理数组:遍历每个元素递归转换 if (Array.isArray(obj)) { return obj.map(item => transformObjectKeys(item)); } const transformedObj = {}; Object.keys(obj).forEach(key => { const newKey = key.replace(/-/g, '_'); transformedObj[newKey] = transformObjectKeys(obj[key]); }); return transformedObj; }
关键说明
- 函数通过创建新对象完成转换,完全不会修改原对象,满足你无法修改原数据的要求
- 递归处理能覆盖所有层级的嵌套对象,确保所有带连字符的键都被转换
- 转换规则是全局替换所有连字符
-为下划线_,有特殊需求可以调整正则表达式
内容的提问来源于stack exchange,提问作者clapmemereview
相关产品推荐
相关产品推荐

