A MultiKeyMap functions much like a hash table, but it allows you to map more than one key to a single value. In this scenario, an entry is keyed by an array of values. The MultiKeyMap class does not place requirements on the order of values to set and get values.
Add the multikeymap module to your project:
$ npm install multikeymap -SThen create instances of the MultiKeyMap class:
const MultiKeyMap = require('multikeymap');
const map = new MultiKeyMap();
map.set(['a', 'b', 'c'], '123');
console.log( map.get(['a', 'b', 'c']) ); // 123
console.log( map.get(['b', 'a', 'c']) ); // 123
console.log( map.get(['c', 'a', 'b']) ); // 123
console.log( map.get(['b', 'a']) ); // undefinedThe interface for the MultiKeyMap class looks very similar to the native ECMAScript Map object.
MultiKeyMap instances store keys and values in a directed graph structure where each vertex is a key used in a keys array, and edges point to all associated key component. This allows for lookups of values that do not depend on key array order.
-
Properties
-
MultiKeyMap.prototype.size: the number of entries in theMultiKeyMapinstance. -
MultiKeyMap.prototype[Symbol.toStringTag]: the tag to use when stringifying theMultiKeyMapinstance. -
MultiKeyMap[Symbol.species]: a reference to theMultiKeyMapconstructor.
-
-
Methods
-
MultiKeyMap.prototype.clear(): clears the contents of theMultiKeyMapinstance. -
MultiKeyMap.prototype.delete(keys): deletes the entry associated with the given array of keys. Returns aBooleanvalue indicating whether or not an item was actually deleted. Parameters:keys: (required) an array of keys referencing the entry to delete.
-
MultiKeyMap.prototype.entries(): returns an ECMAScriptIteratorobject that contains the key array and value pairs for each entry in theMultiKeyMapinstance. -
MultiKeyMap.prototype.forEach(callback [, thisArg]): executes the provided function once for each keys array and value entry in theMultiKeyMapinstance. Parameters:-
callback: (required) the function to call for each entry in theMultiKeyMapinstance. This function is called with the parameters:-
keys: the array of keys used to reference the entry. -
value: the value for the entry. -
map: a reference to theMultiKeyMapinstance.
-
-
thisArg: (optional) value to use asthiswhen executingcallback.
-
-
MultiKeyMap.prototype.get(keys): returns the value for the given array of keys. If no entry is foundundefinedis returned. Parameters:keys: (required) an array of keys referencing the entry to lookup.
-
MultiKeyMap.prototype.has(keys): returns aBooleanindicating whether or not theMultiKeyMapinstance contains an entry for the given array of keys.keys: (required) an array of keys referencing the entry to lookup.
-
MultiKeyMap.prototype.keys(): returns an ECMAScriptIteratorobject that contains the key arrays for each entry in theMultiKeyMapinstance. -
MultiKeyMap.prototype.set(keys, value): sets a value for the given keys. If there is already a value for the givenkeysit is overwritten with the new value. Parameters:-
keys: (required) an array of keys to reference the value. -
value: (required) the value of the entry.
-
-
MultiKeyMap.prototype.traverse(): returns aTraversorobject used to walk through theMultiKeyMapinstance's internal graph to locate a specific value. -
MultiKeyMap.prototype.values(): returns an ECMAScriptIteratorobject that contains the values for each entry in theMultiKeyMapinstance. -
MultiKeyMap.prototype[Symbol.iterator](): returns the same ECMAScriptIteratorobject asMultiKeyMap.prototype.entries().
-
An object used to traverse through a MultiKeyMap instance's internal graph structure one key component at a time. This object functions similarly to an ECMAScript Iterator. Advancing a Traversor is similar to a reducer function, in that all previously requested key values limit the next possible node the Traversor can visit.
Instances of Traversor are created by calling MultiKeyMap.prototype.traverse()
-
Methods
-
Traversor.prototype.next(key): advances theTraversorinstance to the next specified key. A call tonext()amounts to hash lookup, and is performed in O(1) constant time. Parameters:key: the next key component to move to in the connectedMultiKeyMap's internal graph.
The
next()method returns an object with the following keys:-
done: aBooleanvalue indicating whether or not there is a connected vertex with the givenkeyname. If this value istrue, theTraversorhas essentially hit a dead end, and cannot be advanced any further. -
value: the value at the current vertex. If no value exists at the current vertext, then this is set toundefined. This key is omitted ifdoneistrue.
-
-
Example
const MultiKeyMap = require('multikeymap');
const map = new MultiKeyMap();
map.set(['a', 'b', 'c'], 'foo');
map.set(['a', 'c'], 'bar');
map.set(['a', 'b', 'c', 'd'], 'baz');
const traverse = map.traverse();
const b = traverse.next('b');
console.log(b); // { done: false, value: undefined }
const a = traverse.next('a');
console.log(a); // { done: false, value: undefined }
const c = traverse.next('c');
console.log(c); // { done: false, value: 'foo' }
const d = traverse.next('d');
console.log(d); // { done: false, value: 'baz' }
const e = traverse.next('e');
console.log(e); // { done: true }The MultiKeyMap class is read-optimized. All lookups are done in O(n) linear time, where n is the number of items in a keys array.
This library is written using ECMAScript 2015 (version 6), and consequently may not be compatible with older browsers. Specifically, this module utilizes class, Map, Set, and Symbol. Refer to the ECMAScript compatibility chart to see if the multikeymap module will work in your target browsers.