UNPKG

@onesy/utils

Version:
53 lines (45 loc) 2.09 kB
import is from './is'; import cleanValue from './cleanValue'; import castParam from './castParam'; const optionsDefault = { valueOverride: false }; const setObjectValue = function (object) { let keys = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ''; let value = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : undefined; let options_ = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {}; const options = { ...optionsDefault, ...options_ }; if (!(object || keys)) return object; if (is('string', keys)) { const keys_ = keys.split('.').filter(Boolean).map(key => castParam(key)); return setObjectValue(object, keys_, value, options); } if (is('array', keys)) { const key = keys[0]; const keyClean = cleanValue(String(key), { filters: ['.', ','], replaceWith: '' }); if (keys.length === 1) { if (is('array', object) && is('number', key) || is('object', object)) { // Add array or object as a value of the key, if that key doesn't exist atm if (!(object !== null && object !== void 0 && object.hasOwnProperty(key)) || options.valueOverride) object[keyClean] = is('number', keys[1]) ? [] : {}; object[is('string', key) ? keyClean : key] = value; } } else { if (is('array', object) && is('number', key) || is('object', object)) { // Add array or object as a value of the key, if that key doesn't exist atm if (!(object !== null && object !== void 0 && object.hasOwnProperty(key)) || options.valueOverride) object[keyClean] = is('number', keys[1]) ? [] : {}; } const value_ = object[keyClean]; // If we are trying to set a deeply nested value on a // simple value type, meaning if it's not an array or an object, // To override existing value use valueOverride: true option if (!(is('object', value_) || is('array', value_))) return object; return setObjectValue(object[key], keys.slice(1), value, options); } } return object; }; export default setObjectValue;