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:
```javascript
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
var hash = {};
console.log("hasOwnProperty" in hash); // true!
```
Even worse, the magic __proto__
property can really ruin your day2:
```javascript
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:
```javascript
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-inspired3 API:
get
,set
,has
,delete
.
get
accepts a second argument as a fallback for if the key isn't present (like Mozilla'sWeakMap
4).
- 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
.
- rauschma/strmap7 for something a bit more full-featured (albeit exposing its internals everywhere, if you care about that).
- dherman/dictjs8 if you live in an ES6 world.
- es-lab's StringMap.js9 if you can deal with the lack of npm support.