@cmtlyt/cl-utils
Version:
257 lines (256 loc) • 8.59 kB
JavaScript
(function (factory) {
if (typeof module === "object" && typeof module.exports === "object") {
var v = factory(require, exports);
if (v !== undefined) module.exports = v;
}
else if (typeof define === "function" && define.amd) {
define(["require", "exports"], factory);
}
})(function (require, exports) {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.flatObj = exports.getDOMXPath = exports.getDOMSelector = exports.createUUID = exports.getHash = exports.checkInString = exports.objAssign = exports.forEachObj = exports.encodeParams = exports.funcCurry = exports.cachedFuncResult = exports.cloneObj = exports.parseURI = exports.getType = void 0;
/**
* 获取对象类型
* @param {object} obj
* @returns {string}
*/
function getType(obj) {
const baseType = typeof obj;
if (baseType !== 'object')
return baseType;
return Object.prototype.toString.call(obj).slice(8, -1).toLowerCase();
}
exports.getType = getType;
/**
* 获取url查询参数
* @param {string|undefined} key
* @returns {string|object}
*/
function parseURI(key) {
var _a;
const query = location.search.slice(1);
if (key) {
const reg = new RegExp(`${key}=(.*?)(&|$)`);
return decodeURIComponent(((_a = reg.exec(query)) === null || _a === void 0 ? void 0 : _a[1]) || '');
}
const queryMap = query.split('&').reduce((prev, curr) => {
const [key, value] = curr.split('=');
return (prev[key] = decodeURIComponent(value)), prev;
}, {});
return queryMap;
}
exports.parseURI = parseURI;
/**
* 获取普通对象(丐版深克隆)
* @param {T} obj
* @returns {T}
*/
function cloneObj(obj) {
if (['object', 'array'].includes(getType(obj)))
return JSON.parse(JSON.stringify(obj));
return obj;
}
exports.cloneObj = cloneObj;
/**
* 缓存函数执行结果
* @param {functionm} func
* @returns {function}
*/
function cachedFuncResult(func) {
const cacheMap = {};
return function (...args) {
var _a;
const key = JSON.stringify(args);
return ((_a = cacheMap[key]) !== null && _a !== void 0 ? _a : (cacheMap[key] = func.apply(this, args)));
};
}
exports.cachedFuncResult = cachedFuncResult;
/**
* 普通函数转柯里化函数
* @param {function} func
* @returns {function}
*/
function funcCurry(func) {
return function cacheFunc(...args) {
if (args.length >= func.length) {
return func.apply(this, args);
}
return function (...args2) {
return cacheFunc.apply(this, args.concat(args2));
};
};
}
exports.funcCurry = funcCurry;
/**
* 对象转url查询参数
* @param {object} data
* @returns {string}
*/
function encodeParams(data) {
const searchList = [];
for (let key in data) {
// @ts-expect-error
let value = data[key];
if (typeof value === 'object') {
value = JSON.stringify(value);
}
searchList.push(`${key}=${encodeURIComponent(value)}`);
}
return '?' + searchList.join('&');
}
exports.encodeParams = encodeParams;
/**
* 对象版forEach
* @param {object} obj
* @param {Function} callback
*/
function forEachObj(obj, callback) {
Object.keys(obj).forEach((key) => {
callback(obj[key], key, obj);
});
}
exports.forEachObj = forEachObj;
/**
* 合并后面多个对象到第一个对象中(浅拷贝)
* @param {object} target
* @param {object[]} sourceList
* @returns {object}
*/
function objAssign(target, ...sourceList) {
sourceList.forEach(source => {
for (let key in source) {
target[key] = source[key];
}
});
return target;
}
exports.objAssign = objAssign;
/**
* 判断传入的值是否在预先传入的格式化字符串中
* @param {string} formatString
* @param {string} sep ','
* @returns {Function}
*/
function checkInString(formatString, sep = ',') {
const checkMap = formatString.split(sep);
return function (value) {
return !!~checkMap.indexOf(value);
};
}
exports.checkInString = checkInString;
/**
* 获取字符串的hash值
* @param {string} input
* @returns {string}
*/
function getHash(input = '') {
const I64BIT_TABLE = 'abcdefghijklmnopqrstuvwxyz0123456789';
let hash = 5381;
for (let i = input.length - 1; i > -1; i--)
hash += (hash << 5) + input.charCodeAt(i);
let value = hash & 0x7fffffff;
let retValue = '';
do {
retValue += I64BIT_TABLE.charAt(value & 0x23);
} while ((value >>= 6));
return retValue;
}
exports.getHash = getHash;
/**
* 生成uuid格式的随机字符串
* @returns {string}
*/
function createUUID() {
const mask = 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx';
return mask.replace(/x/g, () => ((Math.random() * 64) >> 1).toString(32));
}
exports.createUUID = createUUID;
/**
* 获取传入的dom元素的Selector选择器
* @param {Element} $dom
* @returns {string}
*/
function getDOMSelector($dom) {
function __getDomSelector($dom) {
var _a;
const domTag = $dom.nodeName.toLowerCase();
if ($dom instanceof Element) {
if ($dom.id) {
return domTag + `#${$dom.id}`;
}
else if ($dom.classList.length) {
return domTag + `.${Array.from($dom.classList).join('.')}`;
}
const idx = [...(((_a = $dom.parentNode) === null || _a === void 0 ? void 0 : _a.children) || [])].findIndex(item => item === $dom);
if (~idx) {
return `${domTag}:nth-child(${idx + 1})`;
}
console.warn('当前选择不准确');
return domTag;
}
return '';
}
function __getSelectors($dom, suffix = '') {
if (!$dom || ~suffix.indexOf('#')) {
return suffix;
}
return __getSelectors($dom.parentElement, `${__getDomSelector($dom)}>${suffix}`);
}
return __getSelectors($dom).slice(0, -1);
}
exports.getDOMSelector = getDOMSelector;
/**
* 获取传入的dom元素的XPath选择器
* @param {Element} $dom
* @returns {string}
*/
function getDOMXPath($dom) {
var _a;
if ($dom instanceof Element) {
if ($dom.id !== '') {
return `//*[@id="${$dom.id}"]`;
}
if ($dom === document.body) {
return $dom.nodeName;
}
let ix = 0;
let siblings = ((_a = $dom.parentNode) === null || _a === void 0 ? void 0 : _a.childNodes) || [];
for (let i = 0; i < siblings.length; i++) {
let sibling = siblings[i];
if (sibling === $dom) {
return `${getDOMXPath($dom.parentNode)}/${$dom.nodeName}[${ix + 1}]`;
}
if (sibling.nodeType === 1 && sibling.nodeName === $dom.nodeName) {
++ix;
}
}
return '';
}
return '';
}
exports.getDOMXPath = getDOMXPath;
/**
* 扁平化对象
* @param {object} obj 需要扁平化的对象
* @param {number} depth 深度
* @param {string} sep 分隔符
* @returns {object}
*/
function flatObj(obj, depth, sep = '.') {
const newObj = {};
const flatFunc = (obj, depth, prefix = '') => {
for (let key in obj) {
if (typeof obj[key] === 'object' && !Array.isArray(obj[key]) && depth > 0) {
flatFunc(obj[key], depth - 1, prefix + key + sep);
}
else {
newObj[prefix + key] = obj[key];
}
}
};
flatFunc(obj, depth);
return newObj;
}
exports.flatObj = flatObj;
});