【问题标题】:How to replace/name keys in a Javascript key:value object?如何替换/命名 Javascript 键:值对象中的键?
【发布时间】:2013-07-09 03:06:52
【问题描述】:

我应该如何替换 Javascript 键:值哈希映射(作为对象)中的键字符串?

这是我目前所拥有的:

var hashmap = {"aaa":"foo", "bbb":"bar"};
console.log("before:");
console.log(hashmap);

Object.keys(hashmap).forEach(function(key){
   key = key + "xxx";
   console.log("changing:");
   console.log(key);
});

console.log("after:");
console.log(hashmap);

jsbin 中查看它的运行情况。

“之前”和“之后”哈希图是相同的,所以forEach 似乎在不同的范围内。我该如何解决?也许有更好的方法来做到这一点?

【问题讨论】:

标签: javascript


【解决方案1】:

它与范围无关。 key 只是一个局部变量,它不是实际对象键的别名,因此分配它不会改变对象。

Object.keys(hashmap).forEach(function(key) {
  var newkey = key + "xxx";
  hashmap[newkey] = hashmap[key];
  delete hashmap[key];
});

【讨论】:

  • 请注意,这仅适用于所有新密钥与旧密钥不同的情况,如本例所示,否则该密钥将被完全删除。
  • @HaoQiLi 非常正确。更安全的算法将涉及将对象复制到新对象,然后再复制回来。随意发布这样的答案。
【解决方案2】:

如果键顺序很重要,您可以使用:

const clone = Object.fromEntries(
  Object.entries(o).map(([o_key, o_val]) => {
    if (o_key === key) return [newKey, o_val];
    return [o_key, o_val];
  })
);

这将使用新键在旧键所在的位置创建一个对象。

【讨论】:

    【解决方案3】:

    您只是更改对象键的副本,因此不会更改原始对象。您可以创建一个新对象来保存新键,如下所示:

    var hashmap = {"aaa":"foo", "bbb":"bar"};
    console.log("before:");
    console.log(hashmap);
    
    var newHashmap = {};
    Object.keys(hashmap).forEach(function(key){
        var value = hashmap[key];
    
        key = key + "xxx";
        console.log("changing:");
        console.log(key);
    
        newHashmap[key] = value;
    });
    
    console.log("after:");
    console.log(newHashmap);
    

    【讨论】:

      【解决方案4】:

      您可以使用Array.prototype.reduce()

      const hashmap = { aaa: 'foo', bbb: 'bar' };
      
      const newHashmap = Object.entries(hashmap).reduce((acc, [key, value]) => ({
        ...acc,
        [`${key}xxx`]: value,
      }), {});
      
      console.log(newHashmap);
      // { aaaxxx: 'foo', bbbxxx: 'bar' }
      

      【讨论】:

        猜你喜欢
        • 2011-06-06
        • 1970-01-01
        • 2015-03-31
        • 1970-01-01
        • 1970-01-01
        • 2018-01-09
        • 1970-01-01
        • 2020-05-23
        • 2021-12-11
        相关资源
        最近更新 更多