在JavaScript对象中更改键名

15

我正在检查JavaScript对象中的属性,通过删除前缀“element”来替换某些键,并将新值保存在另一个对象中。

var keys = Object.keys(json);
for (var j=0; j < keys.length; j++) {
   key = keys[j].replace("element_", "");
   switch(key) {
   default :
      tmp[key] = json[key];
      break;
   }
}

问题是,当我这样做时,我可以记录所有键,它们具有正确的名称,但是当我尝试设置与这些键关联的值时,它们是未定义的(json [key])。

这是因为我将键(Objects)转换为Strings(使用replace方法)导致的吗?


switch语句的目的是什么? - user663031
5个回答

34
我们将编写一个小函数来按照您的要求修复键。
function fix_key(key) { return key.replace(/^element_/, ''); }

下划线

_.object(
  _.map(_.keys(json), fix_key),
  _.values(json)
)

ES5/循环

var keys = Object.keys(json);
var result = {};

for (i = 0; i < keys.length; i++) {
  var key = keys[i];
  result[fix_key(key)] = json[key];
}

return result;

ES5/reduce

Object.keys(json) . reduce(function(result, key) {
  result[fix_key(key)] = json[key];
  return result;
}, {});

ES6

Object.assign(
  {},
  ...Object.keys(json) .
    map(key => ({[fix_key(key)]: json[key]}))
)

这将使用ES6的“计算属性名”功能创建一个由多个小对象组成的数组,每个对象都有一个键值对,然后使用ES6的“展开”运算符将它们传递给Object.assign,将它们合并在一起。


为什么我们需要在这里添加最外层括号:({[fix_key(key)]: json[key]})?谢谢。 - Sulliwane
2
否则花括号会被视为JS代码块的开头,而不是对象字面量的开头。 - user663031
我明白了。那么它是如何工作的,仅仅是在代码执行中应用括号优先级吗? - Sulliwane
2
括号对语义没有影响,就像 2(2) 是相同的。在这种情况下,它们仅仅是用来包含一个对象字面量。效果与在任何地方写 ({a: 1}) 相同。 - user663031
太棒了。ES6的解决方案非常优雅。非常感谢。 - Davis Jones

4
问题在于您正在使用新键在原始对象中查找属性。请改用keys [j]而不是key
var keys = Object.keys(json);
for (var j=0; j < keys.length; j++) {
   var key = keys[j].replace(/^element_/, "");
   tmp[key] = json[keys[j]];
}

我在替换中使用了正则表达式,这样^就能匹配字符串的开头。这样只有在字符串为前缀时才会进行替换,不会将noexample_data转换成no_data

注意:你拥有的不是“json”,它是一个JavaScript对象。JSON是一种表示数据的文本格式。

这是因为我用replace方法将键(对象)转换为字符串了吗?

不是。键是字符串,而不是对象。


你也可以通过删除旧属性并添加新属性来更改原始对象中的属性:

var keys = Object.keys(json);
for (var j=0; j < keys.length; j++) {
   if (keys[j].indexOf("element_") == 0) {
     json[keys[j].substr(8)] = json[keys[j]];
     delete json[keys[j]];
   }
}

3

试试这个:

var keys = Object.keys(json);
for (var j=0; j < keys.length; j++) {
   var key = keys[j]; // key
   var value = json[key]; // data
   delete json[key]; // deleting data with old key
   key = key.replace("element_", ""); // renaming key
   json[key] = value; // setting data with new key
}

或者扩展Object的原型
Object.prototype.renameKey = function (oldName, newName) {
    if (!newName) return this;
    if (oldName === newName) return this;

    if (this.hasOwnProperty(oldName)) {
        this[newName] = this[oldName];
        delete this[oldName];
    }
    return this;
};

var keys = Object.keys(json);
keys.forEach(function(key) { json.renameKey(key, key.replace('element_', ''); });

3

ES2019

Object.fromEntries(
  Object.entries(json).map(([k,v]) => [k.replace('element_', ''), v])
);

2

key 不是原始的 json,因为您已经删除了 element_ 前缀。

var keys = Object.keys(json);
for (var j=0; j < keys.length; j++) {
   key = keys[j].replace("element_", "");
   var _key = keys[j];
   switch(key) {
   default :
      tmp[key] = json[_key];
      break;
   }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接