t-comm
Version:
专业、稳定、纯粹的工具库
88 lines (85 loc) • 2.77 kB
JavaScript
import _typeof from '@babel/runtime/helpers/typeof';
import { a as __spreadArray, _ as __assign } from '../tslib.es6-096fffdd.js';
import { get } from './get.mjs';
function internalSet(entity, paths, value, removeIfUndefined) {
if (!paths.length) {
return value;
}
var path = paths[0],
restPath = paths.slice(1);
var clone;
if (!entity && typeof path === 'number') {
clone = [];
} else if (Array.isArray(entity)) {
clone = __spreadArray([], entity, true);
} else {
clone = __assign({}, entity);
}
// Delete prop if `removeIfUndefined` and value is undefined
if (removeIfUndefined && value === undefined && restPath.length === 1) {
// @ts-ignore
delete clone[path][restPath[0]];
} else {
// @ts-ignore
clone[path] = internalSet(clone[path], restPath, value, removeIfUndefined);
}
return clone;
}
function set(entity, paths, value, removeIfUndefined) {
if (removeIfUndefined === void 0) {
removeIfUndefined = false;
}
// Do nothing if `removeIfUndefined` and parent object not exist
if (paths.length && removeIfUndefined && value === undefined
// @ts-ignore
&& !get(entity, paths.slice(0, -1).join('.'))) {
return entity;
}
return internalSet(entity, paths, value, removeIfUndefined);
}
function isObject(obj) {
return _typeof(obj) === 'object' && obj !== null && Object.getPrototypeOf(obj) === Object.prototype;
}
function createEmpty(source) {
return Array.isArray(source) ? [] : {};
}
var keys = typeof Reflect === 'undefined' ? Object.keys : Reflect.ownKeys;
/**
* Merge objects which will create
*/
function merge() {
var sources = [];
for (var _i = 0; _i < arguments.length; _i++) {
sources[_i] = arguments[_i];
}
var clone = createEmpty(sources[0]);
sources.forEach(function (src) {
function internalMerge(path, parentLoopSet) {
var loopSet = new Set(parentLoopSet);
var value = get(src, path.join('.'));
var isArr = Array.isArray(value);
if (isArr || isObject(value)) {
// Only add not loop obj
if (!loopSet.has(value)) {
loopSet.add(value);
var originValue = get(clone, path.join('.'));
if (isArr) {
// Array will always be override
clone = set(clone, path, []);
} else if (!originValue || _typeof(originValue) !== 'object') {
// Init container if not exist
clone = set(clone, path, createEmpty(value));
}
keys(value).forEach(function (key) {
internalMerge(__spreadArray(__spreadArray([], path, true), [key], false), loopSet);
});
}
} else {
clone = set(clone, path, value);
}
}
internalMerge([]);
});
return clone;
}
export { merge, set };