【问题标题】:Change key name in JavaScript object更改 JavaScript 对象中的键名
【发布时间】:2019-02-09 07:00:31
【问题描述】:

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

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 声明的目的是什么?

标签: javascript


【解决方案1】:

我们将编写一个小函数来按照您想要的方式修复密钥。

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/减少

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]})?谢谢
  • 因为否则花括号将被视为 JS 代码块的开头,而不是对象文字的开头。
  • 我明白了。那么它是如何工作的,它只是在代码执行中应用括号优先级吗?
  • 括号对语义没有影响,就像2 等同于(2)。在这种情况下,它们仅包含一个对象字面量。效果和在任何地方写({a: 1})一样。
  • 太棒了。 ES6 解决方案非常优雅。非常感谢。
【解决方案2】:

问题是您正在使用新键查找原始对象中的属性。使用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 是一种用于表示数据的文本格式。

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

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


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

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_', ''); });
    

    【讨论】:

      【解决方案4】:

      ES2019

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

      【讨论】:

        【解决方案5】:

        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;
           }
        }
        

        【讨论】:

          猜你喜欢
          • 2021-09-28
          • 1970-01-01
          • 1970-01-01
          • 2011-10-12
          • 1970-01-01
          • 2021-02-12
          • 2021-08-14
          相关资源
          最近更新 更多