utils-deep-set
Version:
Deep set a nested property.
64 lines (55 loc) • 1.59 kB
JavaScript
;
// MODULES //
var isString = require( 'validate.io-string-primitive' ),
isArray = require( 'validate.io-array' ),
validate = require( './validate.js' ),
defaults = require( './defaults.js' ),
dset = require( './deepset.js' );
// FACTORY //
/**
* FUNCTION: factory( path[, opts] )
* Creates a reusable deep set factory.
*
* @param {String|Array} path - key path
* @param {Object} [opts] - function options
* @param {Boolean} [opts.create=false] - boolean indicating whether to create a path if the key path does not already exist
* @param {String} [opts.sep='.'] - key path separator
* @returns {Function} deep set factory
*/
function factory( path, options ) {
var isStr = isString( path ),
props,
opts,
err;
if ( !isStr && !isArray( path ) ) {
throw new TypeError( 'deepSet()::invalid input argument. Key path must be a string primitive or a key array. Value: `' + path + '`.' );
}
opts = defaults();
if ( arguments.length > 1 ) {
err = validate( opts, options );
if ( err ) {
throw err;
}
}
if ( isStr ) {
props = path.split( opts.sep );
} else {
props = path;
}
/**
* FUNCTION: deepSet( obj, value )
* Deep sets a nested property.
*
* @param {Object|Array} obj - input object
* @param {*} value - value to set
* @returns {Boolean} boolean indicating if the property was successfully set
*/
return function deepSet( obj, value ) {
if ( typeof obj !== 'object' || obj === null ) {
return false;
}
return dset( obj, props, opts.create, value );
};
} // end FUNCTION factory()
// EXPORTS //
module.exports = factory;