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

如何在jQuery的$.each循环中修改对象键名(下划线转短横线)

问题描述

我有一个包含键值对的对象,示例如下:

{
  'primary-buyer': {
    'first_name': 'NAME',
    'last_name': 'NAME'
  }
}

我想要将对象所有键中的下划线_替换为短横线-。我已编写了一段$.each代码实现了键名替换,但不知道如何将新键名赋值给原对象,以便在$.each循环外部访问。代码如下:

let customers = JSON.parse($.cookie('customers'));
$.each(customers, function(key, value) {
    $.each(value, function(k, v) {
        if (k.indexOf('_') >= 0) {
            k = k.replace('_', '-');
        }
    }) 
})

在$.each内部打印k时,结果符合预期(如first-name),但在循环外部打印customers时,仍为原格式(如first_name)。

解决方案

你当前的代码只是修改了循环里的局部变量k,并没有对原对象的键名做任何修改。要更新原对象,需要先创建新键并赋值原属性值,再删除旧键,具体实现如下:

修改后的代码

let customers = JSON.parse($.cookie('customers'));
$.each(customers, function(parentKey, childObj) {
    // 先收集所有需要替换的键,避免遍历过程中修改对象结构导致异常
    const keysToReplace = [];
    $.each(childObj, function(k) {
        if (k.includes('_')) {
            keysToReplace.push(k);
        }
    });

    // 批量替换键名并更新原对象
    keysToReplace.forEach(oldKey => {
        const newKey = oldKey.replace(/_/g, '-'); // 全局替换所有下划线,避免只替换第一个
        childObj[newKey] = childObj[oldKey];
        delete childObj[oldKey];
    });
});

关键说明

  1. 局部变量不影响原对象:循环中的k只是原键名的副本,修改它不会改变原对象的键,必须通过childObj[newKey]直接操作对象属性。
  2. 全局替换下划线:使用replace(/_/g, '-')确保键名里所有的_都被替换成-,而不是只替换第一个。
  3. 先收集再修改:先把需要替换的键存入数组再批量处理,避免在遍历对象时修改结构引发的遍历异常。

扩展:多层嵌套对象处理

如果你的对象有更深层级的嵌套,可以用递归函数处理所有层级的键:

function replaceUnderscores(obj) {
    if (typeof obj !== 'object' || obj === null) return obj;
    
    const processedObj = Array.isArray(obj) ? [] : {};
    $.each(obj, function(k, v) {
        const newKey = k.replace(/_/g, '-');
        processedObj[newKey] = replaceUnderscores(v);
    });
    return processedObj;
}

// 使用方式
let customers = JSON.parse($.cookie('customers'));
customers = replaceUnderscores(customers);

内容的提问来源于stack exchange,提问作者Christopher Ansbaugh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 23:45:54