A lightweight but safe dictionary, for when Object won't cut it
Pull request Compare This branch is 34 commits behind domenic:master.
Permalink
Failed to load latest commit information.
test Version 1.0.0. Jan 24, 2012
README.md Readme updates. Jan 24, 2012
dict.js Version 1.0.0. Jan 24, 2012
package.json Removing erroneous lib directory reference. Jan 29, 2012

README.md

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.log("foo" in hash ? hash["foo"] : "not there"); // "bar"

However this doesn't always work, because your naïve hashes inherit from Object.prototype:

var hash = {};

console.log("hasOwnProperty" in hash); // true!

Even worse, the magic __proto__ property can really ruin your day:

var hash = {};
var anotherObject = { foo: "bar" };

hash["__proto__"] = anotherObject;

console.log("foo" in hash);       // true!!
console.log("__proto__" in hash); // 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 and you're good to go:

var dict = require("dict");

var d = dict();

d.set("foo", "bar");
console.log(d.get("foo", "not there")); // "bar"

console.log(d.has("hasOwnProperty")); // false :)

var anotherObject = { baz: "qux" };
d.set("__proto__", anotherObject);
console.log(d.has("baz"));       // false :)
console.log(d.has("__proto__")); // true :)

Featuring

  • A lightweight ES6-inspired API: get, set, has, delete.
  • get accepts a second argument as a fallback for if the key isn't present (like Mozilla's WeakMap).
  • 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.
  • A full suite of unit tests using mocha and chai: npm test awaits you.

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.