192 lines
3.9 KiB
Markdown
192 lines
3.9 KiB
Markdown
|
Hashish
|
||
|
=======
|
||
|
|
||
|
Hashish is a node.js library for manipulating hash data structures.
|
||
|
It is distilled from the finest that ruby, perl, and haskell have to offer by
|
||
|
way of hash/map interfaces.
|
||
|
|
||
|
Hashish provides a chaining interface, where you can do:
|
||
|
|
||
|
var Hash = require('hashish');
|
||
|
|
||
|
Hash({ a : 1, b : 2, c : 3, d : 4 })
|
||
|
.map(function (x) { return x * 10 })
|
||
|
.filter(function (x) { return x < 30 })
|
||
|
.forEach(function (x, key) {
|
||
|
console.log(key + ' => ' + x);
|
||
|
})
|
||
|
;
|
||
|
|
||
|
Output:
|
||
|
|
||
|
a => 10
|
||
|
b => 20
|
||
|
|
||
|
Some functions and attributes in the chaining interface are terminal, like
|
||
|
`.items` or `.detect()`. They return values of their own instead of the chain
|
||
|
context.
|
||
|
|
||
|
Each function in the chainable interface is also attached to `Hash` in chainless
|
||
|
form:
|
||
|
|
||
|
var Hash = require('hashish');
|
||
|
var obj = { a : 1, b : 2, c : 3, d : 4 };
|
||
|
|
||
|
var mapped = Hash.map(obj, function (x) {
|
||
|
return x * 10
|
||
|
});
|
||
|
|
||
|
console.dir(mapped);
|
||
|
|
||
|
Output:
|
||
|
|
||
|
{ a: 10, b: 20, c: 30, d: 40 }
|
||
|
|
||
|
In either case, the 'this' context of the function calls is the same object that
|
||
|
the chained functions return, so you can make nested chains.
|
||
|
|
||
|
Methods
|
||
|
=======
|
||
|
|
||
|
forEach(cb)
|
||
|
-----------
|
||
|
|
||
|
For each key/value in the hash, calls `cb(value, key)`.
|
||
|
|
||
|
map(cb)
|
||
|
-------
|
||
|
|
||
|
For each key/value in the hash, calls `cb(value, key)`.
|
||
|
The return value of `cb` is the new value at `key` in the resulting hash.
|
||
|
|
||
|
filter(cb)
|
||
|
----------
|
||
|
|
||
|
For each key/value in the hash, calls `cb(value, key)`.
|
||
|
The resulting hash omits key/value pairs where `cb` returned a falsy value.
|
||
|
|
||
|
detect(cb)
|
||
|
----------
|
||
|
|
||
|
Returns the first value in the hash for which `cb(value, key)` is non-falsy.
|
||
|
Order of hashes is not well-defined so watch out for that.
|
||
|
|
||
|
reduce(cb)
|
||
|
----------
|
||
|
|
||
|
Returns the accumulated value of a left-fold over the key/value pairs.
|
||
|
|
||
|
some(cb)
|
||
|
--------
|
||
|
|
||
|
Returns a boolean: whether or not `cb(value, key)` ever returned a non-falsy
|
||
|
value.
|
||
|
|
||
|
update(obj1, [obj2, obj3, ...])
|
||
|
-----------
|
||
|
|
||
|
Mutate the context hash, merging the key/value pairs from the passed objects
|
||
|
and overwriting keys from the context hash if the current `obj` has keys of
|
||
|
the same name. Falsy arguments are silently ignored.
|
||
|
|
||
|
updateAll([ obj1, obj2, ... ])
|
||
|
------------------------------
|
||
|
|
||
|
Like multi-argument `update()` but operate on an array directly.
|
||
|
|
||
|
merge(obj1, [obj2, obj3, ...])
|
||
|
----------
|
||
|
|
||
|
Merge the key/value pairs from the passed objects into the resultant hash
|
||
|
without modifying the context hash. Falsy arguments are silently ignored.
|
||
|
|
||
|
mergeAll([ obj1, obj2, ... ])
|
||
|
------------------------------
|
||
|
|
||
|
Like multi-argument `merge()` but operate on an array directly.
|
||
|
|
||
|
has(key)
|
||
|
--------
|
||
|
|
||
|
Return whether the hash has a key, `key`.
|
||
|
|
||
|
valuesAt(keys)
|
||
|
--------------
|
||
|
|
||
|
Return an Array with the values at the keys from `keys`.
|
||
|
|
||
|
tap(cb)
|
||
|
-------
|
||
|
|
||
|
Call `cb` with the present raw hash.
|
||
|
This function is chainable.
|
||
|
|
||
|
extract(keys)
|
||
|
-------------
|
||
|
|
||
|
Filter by including only those keys in `keys` in the resulting hash.
|
||
|
|
||
|
exclude(keys)
|
||
|
-------------
|
||
|
|
||
|
Filter by excluding those keys in `keys` in the resulting hash.
|
||
|
|
||
|
Attributes
|
||
|
==========
|
||
|
|
||
|
These are attributes in the chaining interface and functions in the `Hash.xxx`
|
||
|
interface.
|
||
|
|
||
|
keys
|
||
|
----
|
||
|
|
||
|
Return all the enumerable attribute keys in the hash.
|
||
|
|
||
|
values
|
||
|
------
|
||
|
|
||
|
Return all the enumerable attribute values in the hash.
|
||
|
|
||
|
compact
|
||
|
-------
|
||
|
|
||
|
Filter out values which are `=== undefined`.
|
||
|
|
||
|
clone
|
||
|
-----
|
||
|
|
||
|
Make a deep copy of the hash.
|
||
|
|
||
|
copy
|
||
|
----
|
||
|
|
||
|
Make a shallow copy of the hash.
|
||
|
|
||
|
length
|
||
|
------
|
||
|
|
||
|
Return the number of key/value pairs in the hash.
|
||
|
Note: use `Hash.size()` for non-chain mode.
|
||
|
|
||
|
size
|
||
|
----
|
||
|
|
||
|
Alias for `length` since `Hash.length` is masked by `Function.prototype`.
|
||
|
|
||
|
See Also
|
||
|
========
|
||
|
|
||
|
See also [creationix's pattern/hash](http://github.com/creationix/pattern),
|
||
|
which does a similar thing except with hash inputs and array outputs.
|
||
|
|
||
|
Installation
|
||
|
============
|
||
|
|
||
|
To install with [npm](http://github.com/isaacs/npm):
|
||
|
|
||
|
npm install hashish
|
||
|
|
||
|
To run the tests with [expresso](http://github.com/visionmedia/expresso):
|
||
|
|
||
|
expresso
|