bury.js

/**
 * Set a value of an object following a chain of nested keys.
 * @methodOf dolla
 * @function
 * 
 * @param {Object} object - An Object to receive keys/value
 * @param {...string} keys - An array of Strings to use as a chain to bury the value
 * @returns {Object} object
 * 
 * @example
 * bury({foo: 1}, 'alpha', 'beta', 'charlie', 'Hello World')
 * // => {
 *     foo: 1,
 *     alpha: {
 *         beta: {
 *             charlie: "Hello World"
 *         }
 *     }
 * }
 */
  
export default function bury (object, ...keys) {
  if (keys.length == 2){
    object[keys[0]] = keys[1]
  } else {
    const key = keys.shift();
    if (!(object[key] instanceof Object)) object[key] = {}
    if (Array.isArray(object[key])) {
        object[key] = bury(Array.from(object[key]), ...keys)
    } else {
        object[key] = bury(Object.assign({}, object[key]), ...keys)
    }
  }
  return object
}