2013-07-09 8 views
6

Come devo sostituire le stringhe di chiavi in ​​una chiave Javascript: valore hash map?Come sostituire/nominare le chiavi in ​​una chiave Javascript: mappa dei valori?

Questo è quello che ho finora:

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

vedere in esecuzione in questo jsbin.

Le hashmap "prima" e "dopo" sono le stesse, quindi forEach sembra essere in un ambito diverso. Come posso ripararlo? Forse ci sono modi migliori per farlo?

+2

Ti piace questa: http://jsbin.com/idobuc/3/edit – Passerby

risposta

13

Non ha nulla a che vedere con lo scope. key è solo una variabile locale, non è un alias per la chiave dell'oggetto attuale, quindi l'assegnazione non cambia l'oggetto.

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

Si noti che questo funziona solo se tutte le nuove chiavi sono diverse dalla vecchia chiave, come in questo esempio, altrimenti la chiave verrebbe completamente cancellata. –

+0

@HaoQiLi Abbastanza vero. Un algoritmo più sicuro implicherebbe la copia dell'oggetto su un nuovo oggetto, quindi la copia. Sentiti libero di postare una risposta del genere. – Barmar

+0

Passerby lo ha già fatto qui: jsbin.com/idobuc/3/edit –

0

Si sono solo cambiando il copia delle chiavi dell'oggetto, quindi l'oggetto originale non verrà modificato. È possibile creare un nuovo oggetto per contenere le nuove chiavi, come questo:

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