Read more

Infinitely nested hashes in Javascript (Coffeescript)

Dominik Schöler
April 07, 2016Software engineer at makandra GmbH

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

Illustration UI/UX Design

UI/UX Design by makandra brand

We make sure that your target audience has the best possible experience with your digital product. You get:

  • Design tailored to your audience
  • Proven processes customized to your needs
  • An expert team of experienced designers
Read more Show archive.org snapshot

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()
Dominik Schöler
April 07, 2016Software engineer at makandra GmbH
Posted by Dominik Schöler to makandra dev (2016-04-07 16:50)