HaoQi Li
HaoQi Li

Reputation: 12348

How to replace/name keys in a Javascript key:value object?

How should I replace the key strings in a Javascript key:value hash map (as an object)?

This is what I have so far:

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

See it running in this jsbin.

The "before" and "after" hashmaps are the same, so the forEach seems to be in a different scope. How can I fix it? Perhaps there are better ways of doing this?

Upvotes: 15

Views: 81549

Answers (5)

onosendi
onosendi

Reputation: 2277

Update

This way is better, in my opinion.

const hashmap = { aaa: 'foo', bbb: 'bar' };

const newHashmap = Object.fromEntries(
  Object
    .entries(hashmap)
    .map(([k, v]) => [`${k}xxx`, v]),
);

console.log(newHashmap);
// { aaaxxx: 'foo', bbbxxx: 'bar' }

Previous

You can use 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' }

Upvotes: 2

Stathis Andronikos
Stathis Andronikos

Reputation: 1259

The function takes as an argument the original map and returns a new one with the keys altered. The call of the mapT(m) just returns the transformed map with the new keys.

function mapT(map){
    const x = new Map();
    for (const [k, v] of map) {
      x.set(k+ "xxx", v);
    }    
    return x;
}

Simple call : var new_map = mapT(mapA);

Upvotes: 0

Ori Lerman
Ori Lerman

Reputation: 41

if keys order is important you can use:

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

this will create an object with the new key in the same place where the old one was.

Upvotes: 4

Finian Lau
Finian Lau

Reputation: 231

You are just changing the copy of the object's keys, so the original object won't be changed. You can create an new object to hold the new keys, like this:

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

Upvotes: 1

Barmar
Barmar

Reputation: 781300

It has nothing to do with scope. key is just a local variable, it's not an alias for the actual object key, so assigning it doesn't change the object.

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

Upvotes: 29

Related Questions