@onesy/utils
Version:
53 lines (52 loc) • 2.69 kB
JavaScript
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const is_1 = __importDefault(require("./is"));
const cleanValue_1 = __importDefault(require("./cleanValue"));
const castParam_1 = __importDefault(require("./castParam"));
const optionsDefault = {
valueOverride: false
};
const setObjectValue = (object, keys = '', value = undefined, options_ = {}) => {
const options = Object.assign(Object.assign({}, optionsDefault), options_);
if (!(object || keys))
return object;
if ((0, is_1.default)('string', keys)) {
const keys_ = keys.split('.').filter(Boolean).map(key => (0, castParam_1.default)(key));
return setObjectValue(object, keys_, value, options);
}
if ((0, is_1.default)('array', keys)) {
const key = keys[0];
const keyClean = (0, cleanValue_1.default)(String(key), { filters: ['.', ','], replaceWith: '' });
if (keys.length === 1) {
if (((0, is_1.default)('array', object) && (0, is_1.default)('number', key)) ||
(0, is_1.default)('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 ? void 0 : object.hasOwnProperty(key)) ||
options.valueOverride)
object[keyClean] = (0, is_1.default)('number', keys[1]) ? [] : {};
object[(0, is_1.default)('string', key) ? keyClean : key] = value;
}
}
else {
if (((0, is_1.default)('array', object) && (0, is_1.default)('number', key)) ||
(0, is_1.default)('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 ? void 0 : object.hasOwnProperty(key)) ||
options.valueOverride)
object[keyClean] = (0, is_1.default)('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 (!((0, is_1.default)('object', value_) || (0, is_1.default)('array', value_)))
return object;
return setObjectValue(object[key], keys.slice(1), value, options);
}
}
return object;
};
exports.default = setObjectValue;
;