A map that takes a "default value" function
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Type Name Latest commit message Commit time
Failed to load latest commit information.



Replaces "maintain a map of constructed objects" boilerplate.

Build Status

Seen this pattern before?

const defaultValue = key => [ key ]

const myMap = new Map()

// ...

function doStuff(thing) {
	if (!myMap.has(thing)) {
		myMap.set(thing, defaultValue(thing))


I figure I've typed that enough times in my life. Now I'm going to just use this module.

const map = keyMaster(key => defaultValue(key))

map.get('howdy') // => [ 'howdy' ]



  • Install: npm install key-master
  • Use: const keyMaster = require('key-master')

This library uses ES2015 syntax, so if you're deploying to IE11, you'll need to be transpiling your project with Babel or something.


const map = keyMaster(defaultValueReturningFunction, [map])

The defaultValueReturningFunction is called whenever the map doesn't already have a value for the given key.

It is passed the key as its first argument.

The map argument is optional. It can be anything implementing .get, .set, .has, and .delete. If not passed in, keyMaster will use a new JavaScript Map by default.

const map = keyMaster(yourFactory)

const map = keyMaster(yourFactory, new WeakMap())

const map = keyMaster(yourFactory, new Map())

const map = keyMaster(yourFactory, { get, set, has, delete })

value = map.get(key)

Returns the value in the map. If there isn't a value for that key, the constructor calls the defaultValueReturningFunction that was passed to the constructor, passing in the key. Whatever the constructor function returns is inserted into the map and returned by get.

map.set(key, value)

Inserts a value into the map, overwriting anything that might be there.


Removes a value from the map.

bool = map.has(key)

Returns true if the key exists in the map, false if the key does not exist in the map.

jsMap = map.getUnderlyingDataStructure()

Returns the underlying data structure. If you passed in a map to the constructor, it returns that. Otherwise, it returns the plain-old object that was used as a hashmap.

Using a plain-old-object as a map

If you want to use an object as a map instead of a Map or WeakMap, you can use this function to create a map to pass in:

function makeObjectMap() {
	var obj = Object.create(null)

	return {
		get: function(key) {
			return obj[key]
		set: function(key, value) {
			obj[key] = value
		has: function(key) {
			return Object.prototype.hasOwnProperty.call(obj, key)
		delete: function(key) {
			delete obj[key]
		object: obj