This module provides BidirectionalMap, StrictBidirectionalMap, and SilentBidirectionalMap classes which extend the built-in JavaScript Map to additionally allow accessing keys from their values.
BidirectionalMap
links keys and values in both directions. Looking up by key returns the value, looking up by value returns the key.- Values stay unique - assigning an existing value to a new key will delete the old key.
StrictBidirectionalMap
instead throws an error if you try to assign an existing value to a new key.SilentBidirectionalMap
will instead ignore/no-op if you try to assign an existing value to a new key.
npm install @viarationis/bidirectional-map
import BidirectionalMap from '@viarationis/bidirectional-map';
const map = new BidirectionalMap();
map.set('key1', 'value1');
map.has('key1'); // true
map.hasValue('value1'); // true
map.get('key1'); // 'value1'
map.getKey('value1'); // 'key1'
map.set('key2', 'value1'); // Deletes 'key1' and remaps 'value1' to 'key2'
map.deleteValue('value1'); // Deleted 'key2' and the map is now empty
import { StrictBidirectionalMap, SilentBidirectionalMap } from '@viarationis/bidirectional-map';
const mapStrict = new StrictBidirectionalMap();
mapStrict.set('key1', 'value1');
mapStrict.set('key2', 'value1'); // Throws error: "Cannot set duplicate value on StrictBidirectionalMap: value1"
const mapSilent = new SilentBidirectionalMap();
mapSilent.set('key1', 'value1');
mapSilent.set('key2', 'value1'); // Does nothing, 'value1' is still mapped to 'key1'
The maps provide the following methods in addition to the standard Map API:
getKey(value)
- Get the key for a valuehasValue(value)
- Check if the map contains a valuedeleteValue(value)
- Delete a value and its key
To help avoid ambiguity, these aliases of standard Map methods are also provided:
getValue(key)
- Alias ofget(key)
hasKey(key)
- Alias ofhas(key)
deleteKey(key)
- Alias ofdelete(key)
Released under the CC0-1.0 License.
I was considering this for a project I was working on, and went ahead and coded it for fun and good practice. I likely won't be using it on this project though, as it isn't quite necessary.