You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过函数重命名JSON键?JS代码i不递增、id未变更问题求解

问题解决方案:修复点击事件状态问题 + JSON键重命名方法

一、先解决你现有代码的核心问题

你的代码里有两个关键bug导致i不递增、对象键id不变,我们一步步修正:

问题根源

  1. i被重复初始化:你把var i = 0;写在点击事件的回调函数里,每次点击按钮都会重新声明并把i重置为0,所以i++之后永远是1,根本不会累加。
  2. 对象键是固定字面量: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:15:12