如何通过函数重命名JSON键?JS代码i不递增、id未变更问题求解
问题解决方案:修复点击事件状态问题 + JSON键重命名方法
一、先解决你现有代码的核心问题
你的代码里有两个关键bug导致i不递增、对象键id不变,我们一步步修正:
问题根源
i被重复初始化:你把var i = 0;写在点击事件的回调函数里,每次点击按钮都会重新声明并把i重置为0,所以i++之后永远是1,根本不会累加。- 对象键是固定字面量:
writeJson里的{ id: { ... } }用的是固定字符串键"id",不管你传什么id参数,这个键都不会变化——要把变量作为键名,得用计算属性名语法。
修改后的完整代码
// 把i声明在事件监听器外面,保留累加状态 let i = 0; button.addEventListener("click", function(){ i++; // 每次点击基于上一次的值累加 const name = "Jason " + i; const surname = "Carl " + i; writeJson(i, name, surname); }); function writeJson(id, name, surname){ // 用[id]把变量id的值作为对象键名 const userObj = { [id]: { "name": name, "surname": surname } }; // 可以打印验证结果 console.log(userObj); }
二、如何创建函数重命名JSON键
JSON本质是字符串,我们通常先把它解析成JavaScript对象,修改键后再转回JSON字符串。分两种场景处理:
1. 简单对象的键重命名
如果只是单层对象,直接赋值+删除旧键即可:
function renameObjectKey(obj, oldKey, newKey) { // 先确认旧键存在,避免报错 if (obj.hasOwnProperty(oldKey)) { obj[newKey] = obj[oldKey]; // 把旧键的值转移到新键 delete obj[oldKey]; // 删除旧键 } return obj; } // 用法示例 const user = { id: 1, username: "Jason" }; const updatedUser = renameObjectKey(user, "username", "fullName"); console.log(updatedUser); // { id: 1, fullName: "Jason" }
2. 嵌套对象/数组的递归重命名
如果JSON里有多层嵌套或者数组,需要递归遍历所有层级:
function renameDeepKey(obj, oldKey, newKey) { // 处理数组:遍历每个元素递归修改 if (Array.isArray(obj)) { return obj.map(item => renameDeepKey(item, oldKey, newKey)); } // 处理对象:遍历所有键递归修改 if (typeof obj === 'object' && obj !== null) { const newObj = {}; for (const key in obj) { if (obj.hasOwnProperty(key)) { // 判断当前键是否需要替换 const currentKey = key === oldKey ? newKey : key; // 递归处理键对应的值 newObj[currentKey] = renameDeepKey(obj[key], oldKey, newKey); } } return newObj; } // 非对象/数组类型,直接返回原值 return obj; } // 用法示例 const data = { id: 1, profile: { name: "Jason", contacts: [{ type: "email", value: "jason@test.com" }] } }; const updatedData = renameDeepKey(data, "name", "fullName"); console.log(updatedData); // 输出:{ id:1, profile: { fullName: "Jason", contacts: [{ type: "email", value: "jason@test.com" }] } }
如果是JSON字符串,记得先解析再处理:
const jsonStr = '{"oldKey": "testValue"}'; const obj = JSON.parse(jsonStr); const newObj = renameObjectKey(obj, "oldKey", "newKey"); const newJsonStr = JSON.stringify(newObj);
内容的提问来源于stack exchange,提问作者Shyngys Rakhad
相关产品推荐
相关产品推荐

