如何在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]; }); });
关键说明
- 局部变量不影响原对象:循环中的
k只是原键名的副本,修改它不会改变原对象的键,必须通过childObj[newKey]直接操作对象属性。 - 全局替换下划线:使用
replace(/_/g, '-')确保键名里所有的_都被替换成-,而不是只替换第一个。 - 先收集再修改:先把需要替换的键存入数组再批量处理,避免在遍历对象时修改结构引发的遍历异常。
扩展:多层嵌套对象处理
如果你的对象有更深层级的嵌套,可以用递归函数处理所有层级的键:
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
相关产品推荐
相关产品推荐

