plain-immutable
Version:
Make plain json data(array and object) immutable
59 lines (47 loc) • 1.46 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.removeIn = removeIn;
exports.remove = remove;
var _index = require('./index');
var _index2 = _interopRequireDefault(_index);
var _util = require('./util');
var _set = require('./set');
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
/**
* Remove the leaf key in key path. If any key is not existent, nothing changed
* @param keyPath string|array
*/
function removeIn(keyPath) {
if (!Array.isArray(keyPath)) keyPath = [keyPath];
// validate key path first
var len = keyPath.length;
(0, _util.validateKeyInKeyPath)(keyPath, keyPath[0]); // consider zero length
for (var ii = 1; ii < len; ++ii) {
(0, _util.validateKeyInKeyPath)(keyPath, keyPath[ii]);
}
if (keyPath.length > 1) {
// remove the key on leaf node
var setter = function setter(value) {
return _remove.call(value, keyPath[len - 1]);
};
return _set.recursivelySet.call(this, keyPath.slice(0, -1), 0, setter, true);
} else {
return _remove.call(this, keyPath[0]);
}
}
function remove(key) {
key = (0, _util.validateKey)(key);
return _remove.call(this, key);
}
function _remove(key) {
if (!this.hasOwnProperty(key)) return this;
var newThis = this.mutable();
if (Array.isArray(newThis)) {
newThis.splice(key, 1);
} else {
delete newThis[key];
}
return (0, _index2.default)(newThis);
}