The NestedHash
class allows you to read and write hashes of any depth. Examples:
hash = {}
NestedHash.write hash, 'a', 'b', 'c', 'value' # => { a: { b: { c: 'value' } } }
NestedHash.read hash, 'a', 'b', 'c' # => 'value'
NestedHash.read hash, 'a' # => { b: { c: 'value' } }
NestedHash.read hash, 'foo', 'bar' # => undefined
Inspired by victusfate Show archive.org snapshot .
Code
class @NestedHash
@read: (objekt, keys...) ->
if objekt and keys.length
@read objekt[keys[0]], keys[1...]...
else
objekt
@write: (objekt, keys..., value) ->
objekt ?= {}
if keys.length
key = keys[0]
objekt[key] = @write(objekt[key], keys[1...]..., value)
objekt
else
objekt = value
Jasmine-Spec
describe 'NestedHash', ->
describe '.write()', ->
it 'writes nested values to a hash', ->
hash = {}
NestedHash.write hash, 'level1', 'level2', 'value'
expect(hash).toEqual
level1:
level2: 'value'
it 'overwrites existing values', ->
hash =
level1:
level2: 'value'
NestedHash.write hash, 'level1', 'level2', 'new value'
expect(hash).toEqual
level1:
level2: 'new value'
describe '.read()', ->
it 'reads nested values from a hash', ->
hash =
level1:
level2: 'value'
value = NestedHash.read hash, 'level1', 'level2'
expect(value).toEqual 'value'
it 'reads nested trees from a hash', ->
hash =
level1:
level2: 'value'
value = NestedHash.read hash, 'level1'
expect(value).toEqual level2: 'value'
it 'returns undefined when any of the keys is missing', ->
value = NestedHash.read {}, 'foo', 'bar'
expect(value).not.toBeDefined()
Posted by Dominik Schöler to makandra dev (2016-04-07 14:50)