An Easy But Safe String-Keyed Store
Don't stuff things into objects. Use a Dict instead.
The Problem
You're probably used to stuffing things into objects:
var hash = {}; hash"foo" = "bar"; console; // "bar"
However this doesn't always work, because your naïve hashes inherit from
Object.prototype
:
var hash = {}; console; // true!
Even worse, the magic __proto__
property can really ruin your day:
var hash = {};var anotherObject = foo: "bar" ; hash"__proto__" = anotherObject; console; // true!!console; // false!!!
Usually you're smart enough to avoid silly key names like "hasOwnProperty"
, "__proto__"
, and all the rest. But
sometimes you want to store user input in your hashes. Uh-oh…
Dict Is the Solution
Just do an npm install dict --save
and you're ready to use this nice-looking API:
var dict = ; var d = ; d; // trued; // "The Empire Strikes Back"dsize; // 3 d; // falsed; // "The Phantom Menace"d; // "The Phantom Menace"d; // trued; // undefinedd; // "Jar-Jar's Fun Time" d; dclear;dsize; // 0
And of course, Dict prides itself in being bulletproof against all that nastiness we talked about earlier:
var d = ; d;console; // "bar" console; // false var anotherObject = baz: "qux" ;d;console; // falseconsole; // true
Featuring
- A lightweight ES6-inspired API:
get
,set
,has
anddelete
basic operations.- A
size
property andforEach
method for introspection. - A
clear
method for clearing out all keys and values.
get
accepts a second argument as a fallback for if the key isn't present (like Mozilla'sWeakMap
).set
returns the value set, just like assignment to an object would.- Doesn't let you get away with being dumb: if you pass a non-string as a key, you're going to get a
TypeError
.
See Also
- rauschma/strmap for something a bit more full-featured (albeit exposing its internals everywhere, if you care about that).
- dherman/dictjs if you live in an ES6 world.
- es-lab's StringMap.js if you can deal with the lack of npm support.
- es6-shim's
Map
if you want more than just strings for your keys. Object.create(null)
if you don't have to deal with V8 or JavaScriptCore, for which"__proto__" in Object.create(null)
is still true.