UNPKG

@cmtlyt/cl-utils

Version:
257 lines (256 loc) 8.59 kB
(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; });