code: function(obj, keychain, value) {
    if (!keychain) { return obj; }
  
    var key = keychain.shift();
  
    // build the current object we need to store data
    if (!obj[key]) {
      obj[key] = _.isArray(key) ? [] : {};
    }
  
    // if it's the last key in the chain, assign the value directly
    if (keychain.length === 0) {
      if (_.isArray(obj[key])) {
        obj[key].push(value);
      } else {
        obj[key] = value;
      }
    }
  
    // recursive parsing of the array, depth-first
    if (keychain.length > 0) {
      assignKeyValue(obj[key], keychain, value);
    }
  
    return obj;
  }
docs: Assigns `value` to a parsed JSON key.  The first parameter is the object which will be modified to store the key/value pair.  The second parameter accepts an array of keys as a string with an option array containing a single string as the last option.  The third parameter is the value to be assigned.  Examples:  `['foo', 'bar', 'baz'] => {foo: {bar: {baz: 'value'}}}`  `['foo', 'bar', ['baz']] => {foo: {bar: {baz: ['value']}}}`  When the final value is an array with a string, the key becomes an array, and values are pushed in to the array, allowing multiple fields with the same name to be assigned to the array.