With an extra internal object for reverse mapping. Best if we add a utility class 😉 like the following:
ES6 syntax (scroll down for ES5 syntax)
class TwoWayMap {
constructor(map) {
this.map = map;
this.reverseMap = {};
for(const key in map) {
const value = map[key];
this.reverseMap[value] = key;
}
}
get(key) { return this.map[key]; }
revGet(key) { return this.reverseMap[key]; }
}
Then you instantiate like this:
const twoWayMap = new TwoWayMap({
'*' : '__asterisk__',
'%' : '__percent__',
....
});
Finally, to use it:
twoWayMap.get('*') //Returns '__asterisk__'
twoWayMap.revGet('__asterisk__') //Returns '*'
Bonus: If you also need set/unset methods, you can do it (inside the class) easily like:
set(key, value) { this.map[key] = value; }
unset(key) { delete this.map[key] }
// same for revSet and revUnset, just use this.reverseMap instead
Equivalent with ES5 (old js) syntax:
function TwoWayMap(map) {
this.map = map;
this.reverseMap = {};
for(var key in map) {
var value = map[key];
this.reverseMap[value] = key;
}
}
TwoWayMap.prototype.get = function(key){ return this.map[key]; };
TwoWayMap.prototype.revGet = function(key){ return this.reverseMap[key]; };
Usage is the same:
var twoWayMap = new TwoWayMap({
'*' : '__asterisk__',
'%' : '__percent__',
....
});
twoWayMap.get('*') //Returns '__asterisk__'
twoWayMap.revGet('__asterisk__') //Returns '*'
Hope this helps. Cheers