Mapject
Get the performance of a Map with the syntax of an object.
Why?
Objects in JavaScript use a natural syntax for key-value storage, but unlike Maps, they aren't optimized for large or dynamic collections. See other differences here.
Often, objects are a good fit for simple key-value applications, but need to be refactored to Maps later. But refactoring objects to Maps can be a headache, especially when using a type system. For example, this refactor changes every single line and changes the object's type:
- let obj: Record<string, number> = {- asdf: 1234,- ghjk: 5678,- };- obj.zxcv = 890;- delete obj.ghjk;+ let obj: Map<string, number> = new Map([+ ["asdf", 1234],+ ["ghjk", 5678],+ ]);+ obj.set("zxcv", 890);+ obj.delete("ghjk");
Mapject
lets you do the same refactor with this:
- let obj: Record<string, number> = {+ let obj: Record<string, number> = Mapject({ asdf: 1234, ghjk: 5678,- };+ }); obj.zxcv = 890; delete obj.ghjk;
Install
$ npm install mapject$ yarn add mapject
Usage
Use a Mapject exactly like you would use an object.
// Create a Mapject; // Create a Mapject with an underlying Map// - mj proxies the passed map, so the map will reflect all changes; // Create a Mapject with initial values from an object// - the object will not reflect changes; // Getting and settingmj.asdf = 1234;console.logmj.asdf; // 1234 // Checking if Mapject has key"asdf" in mj // true // Object.* methodsObject.definePropertymj, "asdf", ; // Copy to plain object; // Iterate over [key, value] pairsfor of mj ; // Get number of keys in the mapjectMapject.sizemj; // Get the underlying mapMapject.getMapmj; // Map
Notes
Similar to Object.create(null)
, a Mapject instance doesn't
inherit methods from Object.prototype
. No special meaning
is given to properties like "prototype"
, "constructor"
,
"__proto__"
, or "hasOwnProperty"
, so there is no danger
to setting user-supplied properties on a Mapject.
mj__proto__ // undefinedmj__proto__ = "anything";
To use methods from Object.prototype
, use Function#call
:
ObjectprototypehasOwnProperty;
Mapject requires ES6 Proxy
to work.