12

我应该如何替换 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似乎在不同的范围内。我该如何解决?也许有更好的方法来做到这一点?

4

4 回答 4

27

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

Object.keys(hashmap).forEach(function(key) {
  var newkey = key + "xxx";
  hashmap[newkey] = hashmap[key];
  delete hashmap[key];
});
于 2013-07-09T03:11:05.223 回答
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];
  })
);

这将在旧密钥所在的同一位置创建一个带有新密钥的对象。

于 2021-07-29T07:42:00.913 回答
1

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

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);
于 2013-07-09T03:22:22.743 回答
0

您可以使用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' }
于 2022-03-05T22:50:42.483 回答