@onesy/utils
Version:
53 lines (45 loc) • 2.09 kB
JavaScript
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;