2013-07-09 2 views
6

Как заменить ключевые строки в ключе Javascript: значение хэш-карты?Как заменить/назвать ключи в 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, по-видимому, находится в другом объеме. Как я могу это исправить? Возможно, есть лучшие способы сделать это?

+2

Как это: http://jsbin.com/idobuc/3/edit – Passerby

ответ

13

Это не имеет никакого отношения к сфере применения. key - это всего лишь локальная переменная, это не псевдоним для фактического ключа объекта, поэтому присвоение его не изменяет объект.

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

Обратите внимание, что это работает только, если все новые ключи отличаются от старого ключа, как в этом примере, иначе ключ будет удален целиком. –

+0

@ HaoQiLi Совершенно верно. Более безопасный алгоритм предполагает копирование объекта на новый объект, а затем копирование. Не стесняйтесь публиковать ответ так. – Barmar

+0

Passerby уже сделал это здесь: jsbin.com/idobuc/3/edit –

0

Вы просто меняете копию ключей объекта, так что исходный объект не будет изменен. Вы можете создать новый объект, чтобы держать новые ключи, например:

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); 
Смежные вопросы