2013-07-09 10 views
6

Jak należy zamienić ciągi kluczy w kluczu Javascript: wartość mieszania mapy?Jak wymienić/wymienić klucze w kluczu Javascript: mapa wartości?

To, co mam tak daleko:

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

Zobacz uruchomiony w tym jsbin.

Histle "przed" i "po" są takie same, więc forEach wydaje się znajdować w innym zakresie. Jak mogę to naprawić? Być może istnieją lepsze sposoby robienia tego?

+2

Jak to: http://jsbin.com/idobuc/3/edit – Passerby

Odpowiedz

13

Nie ma nic wspólnego z lunetą. key to tylko zmienna lokalna, nie jest to alias dla rzeczywistego klucza obiektu, więc przypisanie go nie zmienia obiektu.

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

Zauważ, że to działa tylko wtedy, gdy wszystkie nowe klucze są różne ze starego klucza, jak w tym przykładzie, inaczej klucz zostałby całkowicie usunięty. –

+0

@HaoQiLi Całkiem prawdziwa. Bezpieczniejszy algorytm wymagałby skopiowania obiektu do nowego obiektu, a następnie skopiowania go. Nie krępuj się, aby opublikować odpowiedź w ten sposób. – Barmar

+0

Passerby zrobił to już tutaj: jsbin.com/idobuc/3/edit –

0

Jesteś po prostu zmieniając kopię kluczy obiektu, więc oryginalny obiekt nie zostanie zmieniona. Można utworzyć nowy obiekt do przechowywania nowych kluczy, tak:

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); 
Powiązane problemy