├── .babelrc.json ├── .eslintignore ├── .gitignore ├── .prettierignore ├── .vscode └── settings.json ├── src ├── regexp │ ├── isEmail.js │ ├── isUrl.js │ ├── isIdCard.js │ ├── isColor.js │ ├── index.js │ └── isPhoneNum.js ├── random │ ├── randomColor.js │ ├── randomNumber.js │ └── index.js ├── storage │ ├── removeStorage.js │ ├── getStorage.js │ ├── setStorage.js │ └── index.js ├── time │ ├── isLeapYear.js │ ├── monthDays.js │ ├── isSameDay.js │ ├── twoDaysBetweenNum.js │ ├── formatPassTime.js │ ├── formatRemainTime.js │ ├── index.js │ ├── dateFormater.js │ ├── timeLeft.js │ ├── dateStrFormat.js │ └── twoDateBetweenAllDay.js ├── object │ ├── isEmptyObject.js │ ├── index.js │ ├── getFormData.js │ ├── shallowClone.js │ ├── mergeObject.js │ └── deepClone.js ├── support │ ├── isSupportWebP.js │ ├── index.js │ └── downloadFile.js ├── keycode │ ├── index.js │ └── getKeyName.js ├── string │ ├── index.js │ └── digitUppercase.js ├── device │ ├── index.js │ ├── getOS.js │ └── getExplore.js ├── function │ ├── index.js │ ├── throttle.js │ └── debounce.js ├── number │ ├── standardAmount.js │ ├── index.js │ └── standardIntegerAmount.js ├── screen │ ├── index.js │ ├── toFullScreen.js │ └── exitFullscreen.js ├── url │ ├── index.js │ ├── parseQueryString.js │ └── stringifyQueryString.js ├── class │ ├── index.js │ ├── hasClass.js │ ├── addClass.js │ └── removeClass.js ├── cookie │ ├── index.js │ ├── removeCookie.js │ ├── setCookie.js │ └── getCookie.js ├── array │ ├── index.js │ ├── mergeArrayDelRepeat.js │ ├── uniqueArray.js │ ├── equalityArray.js │ └── subArray.js ├── dom │ ├── setScrollTop.js │ ├── index.js │ ├── getScrollTop.js │ ├── offset.js │ ├── windowResize.js │ └── scrollTo.js └── index.js ├── .github └── dependabot.yml ├── .prettierrc.json ├── .eslintrc.cjs ├── package.json ├── rollup.config.js ├── README.md └── lib ├── realize-utils.browser.js ├── realize-utils.esm.js ├── realize-utils.cjs.js ├── realize-utils.browser.js.map └── realize-utils.cjs.js.map /.babelrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "presets": [["@babel/env", { "modules": false }]] 3 | } 4 | -------------------------------------------------------------------------------- /.eslintignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | lib/ 3 | .vscode 4 | .nyc_output 5 | rollup.config.js -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | test_dist 3 | .vscode 4 | .nyc_output 5 | package-lock.json -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | # Ignore artifacts: 2 | lib 3 | 4 | # Ignore all HTML files: 5 | *.html -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "eslint.run": "onSave", 3 | "markdown.extension.toc.updateOnSave": false, 4 | "search.exclude": { 5 | "**/node_modules": false 6 | }, 7 | "vsicons.presets.nestjs": true 8 | } 9 | -------------------------------------------------------------------------------- /src/regexp/isEmail.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 判断是否为邮箱地址 3 | * @date 2022-02-27 4 | * @param {String} str 5 | * @returns {Boolean} 6 | */ 7 | export let isEmail = function isEmail(str) { 8 | return /\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/.test(str); 9 | }; 10 | -------------------------------------------------------------------------------- /src/random/randomColor.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 描述 随机生成颜色 3 | * @date 2022-02-27 4 | * @returns {String} 5 | */ 6 | export let randomColor = function randomColor() { 7 | return ( 8 | '#' + ('00000' + ((Math.random() * 0x1000000) << 0).toString(16)).slice(-6) 9 | ); 10 | }; 11 | -------------------------------------------------------------------------------- /src/storage/removeStorage.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 删除本地存储 3 | * @date 2022-02-17 4 | * @param {string} name 本地存储名称 5 | * @returns {boolean} 删除成功 true,否则 false 6 | */ 7 | export let removeStorage = function removeStorage(name) { 8 | return window.localStorage.removeItem(name); 9 | }; 10 | -------------------------------------------------------------------------------- /src/regexp/isUrl.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 描述 3 | * @date 判断是否为URL地址 4 | * @param {String} str 5 | * @returns {Boolean} 6 | */ 7 | export let isUrl = function isUrl(str) { 8 | return /[-a-zA-Z0-9@:%._\+~#=]{2,256}\.[a-z]{2,6}\b([-a-zA-Z0-9@:%_\+.~#?&//=]*)/i.test( 9 | str 10 | ); 11 | }; 12 | -------------------------------------------------------------------------------- /src/time/isLeapYear.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 是否为闰年 3 | * @date 2022-02-27 4 | * @param {Number} year 5 | * @returns {Boolean} 6 | */ 7 | export let isLeapYear = function isLeapYear(year) { 8 | if (0 === year % 4 && (year % 100 !== 0 || year % 400 === 0)) { 9 | return true; 10 | } 11 | return false; 12 | }; 13 | -------------------------------------------------------------------------------- /src/object/isEmptyObject.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 判断 obj 是否为空 3 | * @date 2022-02-25 4 | * @param {Object} obj 5 | * @returns {Boolean} 6 | */ 7 | export let isEmptyObject = function isEmptyObject(obj) { 8 | if (!obj || typeof obj !== 'object' || Array.isArray(obj)) return false; 9 | return !Object.keys(obj).length; 10 | }; 11 | -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | version: 2 2 | updates: 3 | # Enable version updates for npm 4 | - package-ecosystem: 'npm' 5 | # Look for `package.json` and `lock` files in the `root` directory 6 | directory: '/' 7 | # Check the npm registry for updates every day (weekdays) 8 | schedule: 9 | interval: 'daily' 10 | -------------------------------------------------------------------------------- /src/storage/getStorage.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 获取本地存储 3 | * @date 2022-02-17 4 | * @param {string} name 本地存储名称 5 | */ 6 | export let getStorage = function getStorage(name) { 7 | const data = window.localStorage.getItem(name); 8 | try { 9 | return JSON.parse(data); 10 | } catch (error) { 11 | return data; 12 | } 13 | }; 14 | -------------------------------------------------------------------------------- /src/storage/setStorage.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 添加本地存储 3 | * @date 2022-02-17 4 | * @param {string} name 本地存储名称 5 | * @param {*} data 本地存储数据 6 | */ 7 | export let setStorage = function setStorage(name, data) { 8 | if (typeof data === 'object') { 9 | data = JSON.stringify(data); 10 | } 11 | window.localStorage.setItem(name, data); 12 | }; 13 | -------------------------------------------------------------------------------- /src/time/monthDays.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 获取指定日期月份的总天数 3 | * @date 2022-02-27 4 | * @param {Date} time 5 | * @returns {Number} 6 | */ 7 | export let monthDays = function monthDays(time) { 8 | time = new Date(time); 9 | var year = time.getFullYear(); 10 | var month = time.getMonth() + 1; 11 | return new Date(year, month, 0).getDate(); 12 | }; 13 | -------------------------------------------------------------------------------- /src/support/isSupportWebP.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 判断浏览器是否支持webP格式图片 3 | * @date 2022-02-27 4 | * @returns {Boolean} 5 | */ 6 | export let isSupportWebP = function isSupportWebP() { 7 | return ( 8 | !![].map && 9 | document 10 | .createElement('canvas') 11 | .toDataURL('image/webp') 12 | .indexOf('data:image/webp') == 0 13 | ); 14 | }; 15 | -------------------------------------------------------------------------------- /src/random/randomNumber.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 生成指定范围[min, max] 的随机数 3 | * @date 2022-02-27 4 | * @param {Number} min 5 | * @param {Number} max 6 | * @returns {Number} 7 | */ 8 | export let randomNumber = function randomNumber(min, max) { 9 | min = Math.ceil(min); 10 | max = Math.floor(max); 11 | return Math.floor(Math.random() * (max - min + 1)) + min; 12 | }; 13 | -------------------------------------------------------------------------------- /src/regexp/isIdCard.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 判断是否为身份证号 3 | * @date 2022-02-27 4 | * @param {String|Number} str 5 | * @returns {Boolean} 6 | */ 7 | export let isIdCard = function isIdCard(str) { 8 | return /^(^[1-9]\d{7}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}$)|(^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])((\d{4})|\d{3}[Xx])$)$/.test( 9 | str 10 | ); 11 | }; 12 | -------------------------------------------------------------------------------- /src/keycode/index.js: -------------------------------------------------------------------------------- 1 | /* 2 | * @Author: wenreq 294491328@qq.com 3 | * @Date: 2022-11-09 22:23:50 4 | * @LastEditors: wenreq 294491328@qq.com 5 | * @LastEditTime: 2022-11-10 22:45:23 6 | * @FilePath: /realize-utils/src/keycode/index.js 7 | * @Description: esm 8 | * 9 | * Copyright (c) 2022 by wenreq 294491328@qq.com, All Rights Reserved. 10 | */ 11 | export { getKeyName } from './getKeyName'; 12 | -------------------------------------------------------------------------------- /src/string/index.js: -------------------------------------------------------------------------------- 1 | /* 2 | * @Author: wenreq 294491328@qq.com 3 | * @Date: 2022-11-09 22:23:50 4 | * @LastEditors: wenreq 294491328@qq.com 5 | * @LastEditTime: 2022-11-10 21:37:54 6 | * @FilePath: /realize-utils/src/string/index.js 7 | * @Description: esm 8 | * 9 | * Copyright (c) 2022 by wenreq 294491328@qq.com, All Rights Reserved. 10 | */ 11 | export { digitUppercase } from './digitUppercase'; 12 | -------------------------------------------------------------------------------- /src/device/index.js: -------------------------------------------------------------------------------- 1 | /* 2 | * @Author: wenreq 294491328@qq.com 3 | * @Date: 2022-11-09 22:23:50 4 | * @LastEditors: wenreq 294491328@qq.com 5 | * @LastEditTime: 2022-11-10 22:51:48 6 | * @FilePath: /realize-utils/src/device/index.js 7 | * @Description: esm 8 | * 9 | * Copyright (c) 2022 by wenreq 294491328@qq.com, All Rights Reserved. 10 | */ 11 | export { getOS } from './getOS'; 12 | export { getExplore } from './getExplore'; 13 | -------------------------------------------------------------------------------- /src/regexp/isColor.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 判断是否为16进制颜色, rgb 或 rgba 3 | * @date 2022-02-27 4 | * @param {String} str 5 | * @returns {Boolean} 6 | */ 7 | export let isColor = function isColor(str) { 8 | return /^(#([0-9a-fA-F]{3}){1,2}|[rR][gG][Bb](\((\s*(2[0-4]\d|25[0-5]|[01]?\d{1,2})\s*,){2}\s*(2[0-4]\d|25[0-5]|[01]?\d{1,2})\s*\)|[Aa]\((\s*(2[0-4]\d|25[0-5]|[01]?\d{1,2})\s*,){3}\s*([01]|0\.\d+)\s*\)))$/.test( 9 | str 10 | ); 11 | }; 12 | -------------------------------------------------------------------------------- /src/function/index.js: -------------------------------------------------------------------------------- 1 | /* 2 | * @Author: wenreq 294491328@qq.com 3 | * @Date: 2022-11-09 22:23:50 4 | * @LastEditors: wenreq 294491328@qq.com 5 | * @LastEditTime: 2022-11-10 22:48:06 6 | * @FilePath: /realize-utils/src/function/index.js 7 | * @Description: esm 8 | * 9 | * Copyright (c) 2022 by wenreq 294491328@qq.com, All Rights Reserved. 10 | */ 11 | export { throttle } from './throttle'; 12 | export { debounce } from './debounce'; 13 | -------------------------------------------------------------------------------- /src/random/index.js: -------------------------------------------------------------------------------- 1 | /* 2 | * @Author: wenreq 294491328@qq.com 3 | * @Date: 2022-11-09 22:23:50 4 | * @LastEditors: wenreq 294491328@qq.com 5 | * @LastEditTime: 2022-11-10 22:30:14 6 | * @FilePath: /realize-utils/src/random/index.js 7 | * @Description: esm 8 | * 9 | * Copyright (c) 2022 by wenreq 294491328@qq.com, All Rights Reserved. 10 | */ 11 | export { randomColor } from './randomColor'; 12 | export { randomNumber } from './randomNumber'; 13 | -------------------------------------------------------------------------------- /src/number/standardAmount.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 将数字(包含小数)逢三一断 3 | * @date 2022-08-06 4 | * @param {Number} value 要转换的值 5 | * @returns {String} 转换后的值 6 | * @example standardAmount(999999999.9991) => '999,999,999.999' 7 | */ 8 | export let standardAmount = function standardAmount(value) { 9 | if (!value) { 10 | return value === 0 ? '0' : '--'; 11 | } 12 | const intPartFormat = parseFloat(value).toLocaleString(); 13 | return intPartFormat; 14 | }; 15 | -------------------------------------------------------------------------------- /src/screen/index.js: -------------------------------------------------------------------------------- 1 | /* 2 | * @Author: wenreq 294491328@qq.com 3 | * @Date: 2022-11-09 22:23:50 4 | * @LastEditors: wenreq 294491328@qq.com 5 | * @LastEditTime: 2022-11-10 21:44:26 6 | * @FilePath: /realize-utils/src/screen/index.js 7 | * @Description: esm 8 | * 9 | * Copyright (c) 2022 by wenreq 294491328@qq.com, All Rights Reserved. 10 | */ 11 | export { exitFullscreen } from './exitFullscreen'; 12 | export { toFullScreen } from './toFullScreen'; 13 | -------------------------------------------------------------------------------- /src/support/index.js: -------------------------------------------------------------------------------- 1 | /* 2 | * @Author: wenreq 294491328@qq.com 3 | * @Date: 2022-11-09 22:23:50 4 | * @LastEditors: wenreq 294491328@qq.com 5 | * @LastEditTime: 2022-11-10 21:36:52 6 | * @FilePath: /realize-utils/src/support/index.js 7 | * @Description: esm 8 | * 9 | * Copyright (c) 2022 by wenreq 294491328@qq.com, All Rights Reserved. 10 | */ 11 | export { downloadFile } from './downloadFile'; 12 | export { isSupportWebP } from './isSupportWebP'; 13 | -------------------------------------------------------------------------------- /src/url/index.js: -------------------------------------------------------------------------------- 1 | /* 2 | * @Author: wenreq 294491328@qq.com 3 | * @Date: 2022-11-09 22:23:50 4 | * @LastEditors: wenreq 294491328@qq.com 5 | * @LastEditTime: 2022-11-09 22:25:51 6 | * @FilePath: /realize-utils/src/url/index.js 7 | * @Description: esm 8 | * 9 | * Copyright (c) 2022 by wenreq 294491328@qq.com, All Rights Reserved. 10 | */ 11 | export { parseQueryString } from './parseQueryString'; 12 | export { stringifyQueryString } from './stringifyQueryString'; 13 | -------------------------------------------------------------------------------- /src/number/index.js: -------------------------------------------------------------------------------- 1 | /* 2 | * @Author: wenreq 294491328@qq.com 3 | * @Date: 2022-11-09 22:23:50 4 | * @LastEditors: wenreq 294491328@qq.com 5 | * @LastEditTime: 2022-11-10 22:43:51 6 | * @FilePath: /realize-utils/src/number/index.js 7 | * @Description: esm 8 | * 9 | * Copyright (c) 2022 by wenreq 294491328@qq.com, All Rights Reserved. 10 | */ 11 | export { standardAmount } from './standardAmount'; 12 | export { standardIntegerAmount } from './standardIntegerAmount'; 13 | -------------------------------------------------------------------------------- /src/class/index.js: -------------------------------------------------------------------------------- 1 | /* 2 | * @Author: wenreq 294491328@qq.com 3 | * @Date: 2022-11-09 22:23:50 4 | * @LastEditors: wenreq 294491328@qq.com 5 | * @LastEditTime: 2022-11-10 22:55:31 6 | * @FilePath: /realize-utils/src/class/index.js 7 | * @Description: esm 8 | * 9 | * Copyright (c) 2022 by wenreq 294491328@qq.com, All Rights Reserved. 10 | */ 11 | export { addClass } from './addClass'; 12 | export { hasClass } from './hasClass'; 13 | export { removeClass } from './removeClass'; 14 | -------------------------------------------------------------------------------- /src/cookie/index.js: -------------------------------------------------------------------------------- 1 | /* 2 | * @Author: wenreq 294491328@qq.com 3 | * @Date: 2022-11-09 22:23:50 4 | * @LastEditors: wenreq 294491328@qq.com 5 | * @LastEditTime: 2022-11-10 22:54:06 6 | * @FilePath: /realize-utils/src/cookie/index.js 7 | * @Description: esm 8 | * 9 | * Copyright (c) 2022 by wenreq 294491328@qq.com, All Rights Reserved. 10 | */ 11 | export { getCookie } from './getCookie'; 12 | export { removeCookie } from './removeCookie'; 13 | export { setCookie } from './setCookie'; 14 | -------------------------------------------------------------------------------- /src/number/standardIntegerAmount.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 将整数数字逢三一断 3 | * @date 2022-08-06 4 | * @param {Number} value 要转换的值 5 | * @returns {String} 转换后的值 6 | * @example standardIntegerAmount(99999999999) => '99,999,999,999' 7 | */ 8 | export let standardIntegerAmount = function standardIntegerAmount(value) { 9 | if (!value) { 10 | return value === 0 ? '0' : '--'; 11 | } 12 | const intPartFormat = value.toString().replace(/(\d)(?=(?:\d{3})+$)/g, '$1,'); 13 | return intPartFormat; 14 | }; 15 | -------------------------------------------------------------------------------- /src/screen/toFullScreen.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 描述: 全屏 3 | * @date 2022-08-16 4 | */ 5 | export let toFullScreen = function toFullScreen() { 6 | let elem = document.body; 7 | elem.webkitRequestFullScreen 8 | ? elem.webkitRequestFullScreen() 9 | : elem.mozRequestFullScreen 10 | ? elem.mozRequestFullScreen() 11 | : elem.msRequestFullscreen 12 | ? elem.msRequestFullscreen() 13 | : elem.requestFullScreen 14 | ? elem.requestFullScreen() 15 | : alert('浏览器不支持全屏'); 16 | }; 17 | -------------------------------------------------------------------------------- /src/storage/index.js: -------------------------------------------------------------------------------- 1 | /* 2 | * @Author: wenreq 294491328@qq.com 3 | * @Date: 2022-11-09 22:23:50 4 | * @LastEditors: wenreq 294491328@qq.com 5 | * @LastEditTime: 2022-11-10 21:41:48 6 | * @FilePath: /realize-utils/src/storage/index.js 7 | * @Description: esm 8 | * 9 | * Copyright (c) 2022 by wenreq 294491328@qq.com, All Rights Reserved. 10 | */ 11 | export { getStorage } from './getStorage'; 12 | export { removeStorage } from './removeStorage'; 13 | export { setStorage } from './setStorage'; 14 | -------------------------------------------------------------------------------- /.prettierrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "arrowParens": "always", 3 | "bracketSameLine": false, 4 | "bracketSpacing": true, 5 | "embeddedLanguageFormatting": "auto", 6 | "htmlWhitespaceSensitivity": "css", 7 | "insertPragma": false, 8 | "jsxSingleQuote": false, 9 | "printWidth": 80, 10 | "proseWrap": "always", 11 | "quoteProps": "as-needed", 12 | "requirePragma": false, 13 | "semi": true, 14 | "singleQuote": true, 15 | "tabWidth": 2, 16 | "trailingComma": "es5", 17 | "useTabs": false, 18 | "vueIndentScriptAndStyle": false 19 | } 20 | -------------------------------------------------------------------------------- /src/object/index.js: -------------------------------------------------------------------------------- 1 | /* 2 | * @Author: wenreq 294491328@qq.com 3 | * @Date: 2022-11-09 22:23:50 4 | * @LastEditors: wenreq 294491328@qq.com 5 | * @LastEditTime: 2022-11-10 22:43:20 6 | * @FilePath: /realize-utils/src/object/index.js 7 | * @Description: esm 8 | * 9 | * Copyright (c) 2022 by wenreq 294491328@qq.com, All Rights Reserved. 10 | */ 11 | export { deepClone } from './deepClone'; 12 | export { getFormData } from './getFormData'; 13 | export { isEmptyObject } from './isEmptyObject'; 14 | export { shallowClone } from './shallowClone'; 15 | -------------------------------------------------------------------------------- /src/array/index.js: -------------------------------------------------------------------------------- 1 | /* 2 | * @Author: wenreq 294491328@qq.com 3 | * @Date: 2022-11-09 22:23:50 4 | * @LastEditors: wenreq 294491328@qq.com 5 | * @LastEditTime: 2022-11-10 22:57:52 6 | * @FilePath: /realize-utils/src/array/index.js 7 | * @Description: esm 8 | * 9 | * Copyright (c) 2022 by wenreq 294491328@qq.com, All Rights Reserved. 10 | */ 11 | export { equalityArray } from './equalityArray'; 12 | export { mergeArrayDelRepeat } from './mergeArrayDelRepeat'; 13 | export { subArray } from './subArray'; 14 | export { uniqueArray } from './uniqueArray'; 15 | -------------------------------------------------------------------------------- /src/screen/exitFullscreen.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 退出全屏 3 | * @date 2022-08-16 4 | */ 5 | export let exitFullscreen = function exitFullscreen() { 6 | let elem = parent.document; 7 | elem.webkitCancelFullScreen 8 | ? elem.webkitCancelFullScreen() 9 | : elem.mozCancelFullScreen 10 | ? elem.mozCancelFullScreen() 11 | : elem.cancelFullScreen 12 | ? elem.cancelFullScreen() 13 | : elem.msExitFullscreen 14 | ? elem.msExitFullscreen() 15 | : elem.exitFullscreen 16 | ? elem.exitFullscreen() 17 | : alert('切换失败,可尝试Esc退出'); 18 | }; 19 | -------------------------------------------------------------------------------- /src/regexp/index.js: -------------------------------------------------------------------------------- 1 | /* 2 | * @Author: wenreq 294491328@qq.com 3 | * @Date: 2022-11-09 22:23:50 4 | * @LastEditors: wenreq 294491328@qq.com 5 | * @LastEditTime: 2022-11-10 21:49:23 6 | * @FilePath: /realize-utils/src/regexp/index.js 7 | * @Description: esm 8 | * 9 | * Copyright (c) 2022 by wenreq 294491328@qq.com, All Rights Reserved. 10 | */ 11 | export { isColor } from './isColor'; 12 | export { isEmail } from './isEmail'; 13 | export { isIdCard } from './isIdCard'; 14 | export { isPhoneNum } from './isPhoneNum'; 15 | export { isUrl } from './isUrl'; 16 | -------------------------------------------------------------------------------- /src/object/getFormData.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 将对象转换为 formData 对象 3 | * @date 2022-02-25 4 | * @param {Object} object 需要转换的对象 5 | * @returns {Object} formData 对象 6 | */ 7 | export let getFormData = function getFormData(object) { 8 | let formData = new FormData(); 9 | Object.keys(object).forEach((key) => { 10 | let value = object[key]; 11 | if (Array.isArray(value)) { 12 | value.forEach((subValue, i) => formData.append(key + `[${i}]`, subValue)); 13 | } else { 14 | formData.append(key, object[key]); 15 | } 16 | }); 17 | return formData; 18 | }; 19 | -------------------------------------------------------------------------------- /src/dom/setScrollTop.js: -------------------------------------------------------------------------------- 1 | /* 2 | * @Author: wenreq 294491328@qq.com 3 | * @Date: 2022-11-09 21:17:24 4 | * @LastEditors: wenreq 294491328@qq.com 5 | * @LastEditTime: 2022-11-10 22:49:20 6 | * @FilePath: /realize-utils/src/dom/setScrollTop.js 7 | * @Description: 8 | * 9 | * Copyright (c) 2022 by wenreq 294491328@qq.com, All Rights Reserved. 10 | */ 11 | /** 12 | * 设置滚动条距顶部的距离 13 | * @date 2022-02-24 14 | * @param {Number} value 距顶部的距离的值 15 | */ 16 | export let setScrollTop = function setScrollTop(value) { 17 | window.scrollTo(0, value); 18 | return value; 19 | }; 20 | -------------------------------------------------------------------------------- /src/dom/index.js: -------------------------------------------------------------------------------- 1 | /* 2 | * @Author: wenreq 294491328@qq.com 3 | * @Date: 2022-11-09 22:23:50 4 | * @LastEditors: wenreq 294491328@qq.com 5 | * @LastEditTime: 2022-11-10 22:51:29 6 | * @FilePath: /realize-utils/src/dom/index.js 7 | * @Description: esm 8 | * 9 | * Copyright (c) 2022 by wenreq 294491328@qq.com, All Rights Reserved. 10 | */ 11 | export { getScrollTop } from './getScrollTop'; 12 | export { offset } from './offset'; 13 | export { scrollTo } from './scrollTo'; 14 | export { setScrollTop } from './setScrollTop'; 15 | export { windowResize } from './windowResize'; 16 | -------------------------------------------------------------------------------- /src/regexp/isPhoneNum.js: -------------------------------------------------------------------------------- 1 | /* 2 | * @Author: wenreq 294491328@qq.com 3 | * @Date: 2022-11-10 23:22:07 4 | * @LastEditors: wenreq 294491328@qq.com 5 | * @LastEditTime: 2022-11-12 00:06:11 6 | * @FilePath: /realize-utils/src/regexp/isPhoneNum.js 7 | * @Description: 8 | * 9 | * Copyright (c) 2022 by wenreq 294491328@qq.com, All Rights Reserved. 10 | */ 11 | /** 12 | * 判断是否为手机号 13 | * @date 2022-02-27 14 | * @param {String|Number} str 15 | * @returns {Boolean} 16 | */ 17 | export let isPhoneNum = function isPhoneNum(str) { 18 | return /^(\+?0?86\-?)?1[3456789]\d{9}$/.test(str); 19 | }; 20 | -------------------------------------------------------------------------------- /.eslintrc.cjs: -------------------------------------------------------------------------------- 1 | /* 2 | * @Author: wenreq 294491328@qq.com 3 | * @Date: 2022-11-11 23:41:22 4 | * @LastEditors: wenreq 294491328@qq.com 5 | * @LastEditTime: 2022-11-12 00:09:34 6 | * @FilePath: /realize-utils/.eslintrc.cjs 7 | * @Description: 8 | * 9 | * Copyright (c) 2022 by wenreq 294491328@qq.com, All Rights Reserved. 10 | */ 11 | module.exports = { 12 | env: { 13 | browser: true, 14 | es2021: true, 15 | }, 16 | extends: ['eslint:recommended', 'plugin:prettier/recommended'], 17 | overrides: [], 18 | parserOptions: { 19 | ecmaVersion: 'latest', 20 | sourceType: 'module', 21 | }, 22 | rules: {}, 23 | }; 24 | -------------------------------------------------------------------------------- /src/dom/getScrollTop.js: -------------------------------------------------------------------------------- 1 | /* 2 | * @Author: wenreq 294491328@qq.com 3 | * @Date: 2022-11-09 21:17:24 4 | * @LastEditors: wenreq 294491328@qq.com 5 | * @LastEditTime: 2022-11-10 22:51:14 6 | * @FilePath: /realize-utils/src/dom/getScrollTop.js 7 | * @Description: 8 | * 9 | * Copyright (c) 2022 by wenreq 294491328@qq.com, All Rights Reserved. 10 | */ 11 | /** 12 | * 获取滚动条距顶部的距离 13 | * @date 2022-02-24 14 | * @returns {Number} 15 | */ 16 | export let getScrollTop = function getScrollTop() { 17 | return ( 18 | (document.documentElement && document.documentElement.scrollTop) || 19 | document.body.scrollTop 20 | ); 21 | }; 22 | -------------------------------------------------------------------------------- /src/cookie/removeCookie.js: -------------------------------------------------------------------------------- 1 | /* 2 | * @Author: wenreq 294491328@qq.com 3 | * @Date: 2022-11-09 21:17:24 4 | * @LastEditors: wenreq 294491328@qq.com 5 | * @LastEditTime: 2022-11-11 21:24:08 6 | * @FilePath: /realize-utils/src/cookie/removeCookie.js 7 | * @Description: 8 | * 9 | * Copyright (c) 2022 by wenreq 294491328@qq.com, All Rights Reserved. 10 | */ 11 | import { setCookie } from './setCookie'; 12 | 13 | /** 14 | * 根据 name 删除 cookie 15 | * @date 2022-02-18 16 | * @param {String} name cookie 的名称 17 | */ 18 | export let removeCookie = function removeCookie(name) { 19 | // 设置已过期,系统会立刻删除 cookie 20 | setCookie(name, '1', -1); 21 | }; 22 | -------------------------------------------------------------------------------- /src/class/hasClass.js: -------------------------------------------------------------------------------- 1 | /* 2 | * @Author: wenreq 294491328@qq.com 3 | * @Date: 2022-11-09 21:17:24 4 | * @LastEditors: wenreq 294491328@qq.com 5 | * @LastEditTime: 2022-11-10 22:55:41 6 | * @FilePath: /realize-utils/src/class/hasClass.js 7 | * @Description: 8 | * 9 | * Copyright (c) 2022 by wenreq 294491328@qq.com, All Rights Reserved. 10 | */ 11 | /** 12 | * 判断元素是否有某个class 13 | * @date 2022-02-22 14 | * @param {HTMLElement} ele 15 | * @param {String} cls 16 | * @returns {Boolean} 包含返回true,否则返回false 17 | */ 18 | export let hasClass = function hasClass(ele, cls) { 19 | return new RegExp('(\\s|^)' + cls + '(\\s|$)').test(ele.className); 20 | }; 21 | -------------------------------------------------------------------------------- /src/class/addClass.js: -------------------------------------------------------------------------------- 1 | /* 2 | * @Author: wenreq 294491328@qq.com 3 | * @Date: 2022-11-09 21:17:24 4 | * @LastEditors: wenreq 294491328@qq.com 5 | * @LastEditTime: 2022-11-11 21:24:02 6 | * @FilePath: /realize-utils/src/class/addClass.js 7 | * @Description: 8 | * 9 | * Copyright (c) 2022 by wenreq 294491328@qq.com, All Rights Reserved. 10 | */ 11 | import { hasClass } from './hasClass'; 12 | 13 | /** 14 | * 为元素添加class 15 | * @date 2022-02-22 16 | * @param {HTMLElement} ele 17 | * @param {String} cls 18 | */ 19 | export let addClass = function addClass(ele, cls) { 20 | if (!hasClass(ele, cls)) { 21 | ele.className += ' ' + cls; 22 | } 23 | }; 24 | -------------------------------------------------------------------------------- /src/time/isSameDay.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 判断是否为同一天 3 | * @date 2022-02-27 4 | * @param {Date} date1 5 | * @param {Date} date2 可选 / 默认值:当天 6 | * @returns {Boolean} 7 | */ 8 | export let isSameDay = function isSameDay(date1, date2) { 9 | if (!date2) { 10 | date2 = new Date(); 11 | } 12 | var date1_year = date1.getFullYear(), 13 | date1_month = date1.getMonth() + 1, 14 | date1_date = date1.getDate(); 15 | var date2_year = date2.getFullYear(), 16 | date2_month = date2.getMonth() + 1, 17 | date2_date = date2.getDate(); 18 | return ( 19 | date1_date === date2_date && 20 | date1_month === date2_month && 21 | date1_year === date2_year 22 | ); 23 | }; 24 | -------------------------------------------------------------------------------- /src/function/throttle.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 节流 3 | * flag 开始为 true 则进入函数之后会执行计时器, 在一秒之后会执行 4 | * 继续向下之后flag被变为false, 那么在此进入函数之后将不再执行计时器 5 | * 在计时器执行完成之后, 将 flag变为true 之后才可以继续执行 6 | * 节流起到了可控制高频事件逻辑执行的次数 7 | * @date 2022-02-24 8 | * @param {Function} fn 延迟毫秒后执行的函数。 9 | * @param {Number} wait 延迟的毫秒数 10 | * @param {Boolean} immediate 为true时,fn在可以执行时立即执行,否则必须延时wait后才能执行 11 | */ 12 | export let throttle = function throttle(fn, wait, immediate = false) { 13 | let timeout = null; 14 | return (...args) => { 15 | if (!timeout) { 16 | immediate && fn.apply(this, args); 17 | timeout = setTimeout(() => { 18 | !immediate && fn.apply(this, args); 19 | timeout = null; 20 | }, wait); 21 | } 22 | }; 23 | }; 24 | -------------------------------------------------------------------------------- /src/array/mergeArrayDelRepeat.js: -------------------------------------------------------------------------------- 1 | /* 2 | * @Author: wenreq 294491328@qq.com 3 | * @Date: 2022-11-09 21:17:24 4 | * @LastEditors: wenreq 294491328@qq.com 5 | * @LastEditTime: 2022-11-10 22:57:28 6 | * @FilePath: /realize-utils/src/array/mergeArrayDelRepeat.js 7 | * @Description: 8 | * 9 | * Copyright (c) 2022 by wenreq 294491328@qq.com, All Rights Reserved. 10 | */ 11 | /** 12 | * 将多个数组合并为一个新的数组,并去重。 13 | * 该方法可以传一个或多个数组 14 | * @date 2022-02-18 15 | * @returns {Array} 将多个数组合并后并去重后的新数组 16 | */ 17 | export let mergeArrayDelRepeat = function mergeArrayDelRepeat() { 18 | let newArr = []; 19 | for (let i = 0; i < arguments.length; i++) { 20 | newArr.push(...arguments[i]); 21 | } 22 | return [...new Set([...newArr])]; 23 | }; 24 | -------------------------------------------------------------------------------- /src/object/shallowClone.js: -------------------------------------------------------------------------------- 1 | /* 2 | * @Author: wenreq 294491328@qq.com 3 | * @Date: 2022-11-10 23:22:07 4 | * @LastEditors: wenreq 294491328@qq.com 5 | * @LastEditTime: 2022-11-11 23:53:34 6 | * @FilePath: /realize-utils/src/object/shallowClone.js 7 | * @Description: 8 | * 9 | * Copyright (c) 2022 by wenreq 294491328@qq.com, All Rights Reserved. 10 | */ 11 | /** 12 | * 浅克隆 13 | * @date 2022-02-25 14 | * @param {Object} obj 需要拷贝的对象 15 | * @returns {Object} 浅拷贝之后的对象 16 | */ 17 | export let shallowClone = function shallowClone(obj) { 18 | if (!(obj instanceof Object)) { 19 | throw new Error('请传入对象'); 20 | } 21 | const res = {}; 22 | for (const key in obj) { 23 | res[key] = obj[key]; 24 | } 25 | return res; 26 | }; 27 | -------------------------------------------------------------------------------- /src/time/twoDaysBetweenNum.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 两个日期之间的天数 3 | * @date 2022-06-16 4 | * @param {Date} startDay 开始日期 '2022-06-16' 5 | * @param {Date} endDay 结束日期 '2022-06-20' 6 | * @returns {Number} 两个日期之间的天数 4 7 | */ 8 | export let twoDaysBetweenNum = (startDay, endDay) => { 9 | if ( 10 | startDay === '' || 11 | startDay === null || 12 | startDay === undefined || 13 | endDay === '' || 14 | endDay === null || 15 | endDay === undefined 16 | ) { 17 | return null; 18 | } 19 | const startDate = Date.parse(startDay); 20 | const endDate = Date.parse(endDay); 21 | if (startDate == endDate) { 22 | return 0; 23 | } 24 | const days = (endDate - startDate) / (1 * 24 * 60 * 60 * 1000); 25 | return days; 26 | }; 27 | -------------------------------------------------------------------------------- /src/array/uniqueArray.js: -------------------------------------------------------------------------------- 1 | /* 2 | * @Author: wenreq 294491328@qq.com 3 | * @Date: 2022-11-09 21:17:24 4 | * @LastEditors: wenreq 294491328@qq.com 5 | * @LastEditTime: 2022-11-10 22:56:45 6 | * @FilePath: /realize-utils/src/array/uniqueArray.js 7 | * @Description: 8 | * 9 | * Copyright (c) 2022 by wenreq 294491328@qq.com, All Rights Reserved. 10 | */ 11 | /** 12 | * 数组去除重复项 13 | * @date 2022-02-18 14 | * @param {Array} array 需要去重的数组 15 | * @returns {Array} 去重之后的数组,如果传入的不是数组则返回空数组。 16 | */ 17 | export let uniqueArray = function uniqueArray(array) { 18 | if (!Array.isArray(array)) { 19 | throw new Error('第一个参数必须是数组'); 20 | } 21 | if (array.length == 1) { 22 | return array; 23 | } 24 | return [...new Set(array)]; 25 | }; 26 | -------------------------------------------------------------------------------- /src/cookie/setCookie.js: -------------------------------------------------------------------------------- 1 | /* 2 | * @Author: wenreq 294491328@qq.com 3 | * @Date: 2022-11-09 21:17:24 4 | * @LastEditors: wenreq 294491328@qq.com 5 | * @LastEditTime: 2022-11-10 22:52:57 6 | * @FilePath: /realize-utils/src/cookie/setCookie.js 7 | * @Description: 8 | * 9 | * Copyright (c) 2022 by wenreq 294491328@qq.com, All Rights Reserved. 10 | */ 11 | /** 12 | * 设置 cookie 13 | * @date 2022-02-18 14 | * @param {String} name cookie 名称 15 | * @param {String} value cookie 的值 16 | * @param {Number} days cookie 的有限天数 17 | */ 18 | export let setCookie = function setCookie(name, value, days) { 19 | var date = new Date(); 20 | date.setDate(date.getDate() + days); 21 | document.cookie = name + '=' + value + ';expires=' + date.toUTCString(); 22 | }; 23 | -------------------------------------------------------------------------------- /src/class/removeClass.js: -------------------------------------------------------------------------------- 1 | /* 2 | * @Author: wenreq 294491328@qq.com 3 | * @Date: 2022-11-09 21:17:24 4 | * @LastEditors: wenreq 294491328@qq.com 5 | * @LastEditTime: 2022-11-11 21:24:05 6 | * @FilePath: /realize-utils/src/class/removeClass.js 7 | * @Description: 8 | * 9 | * Copyright (c) 2022 by wenreq 294491328@qq.com, All Rights Reserved. 10 | */ 11 | import { hasClass } from './hasClass'; 12 | 13 | /** 14 | * 为元素移除某个class类 15 | * @date 2022-02-22 16 | * @param {HTMLElement} ele 元素 17 | * @param {String} cls 类名 18 | */ 19 | export let removeClass = function removeClass(ele, cls) { 20 | if (hasClass(ele, cls)) { 21 | var reg = new RegExp('(\\s|^)' + cls + '(\\s|$)'); 22 | ele.className = ele.className.replace(reg, ' '); 23 | } 24 | }; 25 | -------------------------------------------------------------------------------- /src/time/formatPassTime.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 格式化${startTime}距现在的已过时间 3 | * @param {Date} startTime '2020-11-29' 4 | * @return {String} '1天前' '1年前' 5 | */ 6 | export let formatPassTime = function formatPassTime(startTime) { 7 | var currentTime = Date.parse(new Date()), 8 | time = currentTime - Date.parse(new Date(startTime)), 9 | day = parseInt(time / (1000 * 60 * 60 * 24)), 10 | hour = parseInt(time / (1000 * 60 * 60)), 11 | min = parseInt(time / (1000 * 60)), 12 | month = parseInt(day / 30), 13 | year = parseInt(month / 12); 14 | if (year) return year + '年前'; 15 | if (month) return month + '个月前'; 16 | if (day) return day + '天前'; 17 | if (hour) return hour + '小时前'; 18 | if (min) return min + '分钟前'; 19 | else return '刚刚'; 20 | }; 21 | -------------------------------------------------------------------------------- /src/time/formatRemainTime.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 计算从一个时间到现在过去多久 3 | * @date 2022-02-24 4 | * @param {String} 字符串日期 '2020-11-29' 5 | * @returns {String} '451天15小时17分钟25秒' 6 | */ 7 | export let formatRemainTime = function formatRemainTime(time) { 8 | const nowStamp = new Date().getTime(); 9 | const targetStamp = new Date(time.replace(/-/g, '/')).getTime(); 10 | const difference = nowStamp - targetStamp; 11 | const allSeconds = Math.floor(difference / 1000); 12 | const allMinutes = Math.floor(allSeconds / 60); 13 | const allHours = Math.floor(allMinutes / 60); 14 | const day = Math.floor(allHours / 24); 15 | const hours = allHours % 24; 16 | const minutes = allMinutes % 60; 17 | const seconds = allSeconds % 60; 18 | return `${day}天${hours}小时${minutes}分钟${seconds}秒`; 19 | }; 20 | -------------------------------------------------------------------------------- /src/dom/offset.js: -------------------------------------------------------------------------------- 1 | /* 2 | * @Author: wenreq 294491328@qq.com 3 | * @Date: 2022-11-09 21:17:24 4 | * @LastEditors: wenreq 294491328@qq.com 5 | * @LastEditTime: 2022-11-10 22:50:14 6 | * @FilePath: /realize-utils/src/dom/offset.js 7 | * @Description: 8 | * 9 | * Copyright (c) 2022 by wenreq 294491328@qq.com, All Rights Reserved. 10 | */ 11 | /** 12 | * 获取一个元素距离文档(document)的位置,类似于JQ中的offset() 13 | * @date 2022-02-24 14 | * @param {HTMLElement} ele 元素 15 | * @returns { {left: number, top: number} } 距离文档左侧、顶部的距离 16 | */ 17 | export let offset = function offset(ele) { 18 | var pos = { 19 | left: 0, 20 | top: 0, 21 | }; 22 | while (ele) { 23 | pos.left += ele.offsetLeft; 24 | pos.top += ele.offsetTop; 25 | ele += ele.offsetParent; 26 | } 27 | return pos; 28 | }; 29 | -------------------------------------------------------------------------------- /src/cookie/getCookie.js: -------------------------------------------------------------------------------- 1 | /* 2 | * @Author: wenreq 294491328@qq.com 3 | * @Date: 2022-11-09 21:17:24 4 | * @LastEditors: wenreq 294491328@qq.com 5 | * @LastEditTime: 2022-11-10 22:54:19 6 | * @FilePath: /realize-utils/src/cookie/getCookie.js 7 | * @Description: 8 | * 9 | * Copyright (c) 2022 by wenreq 294491328@qq.com, All Rights Reserved. 10 | */ 11 | /** 12 | * 根据 name 读取 cookie 13 | * @date 2022-02-18 14 | * @param {String} name 15 | * @returns {String} 16 | */ 17 | export let getCookie = function getCookie(name) { 18 | let cookieArr = document.cookie.replace(/\s/g, '').split(';'); 19 | for (let i = 0; i < cookieArr.length; i++) { 20 | const eleArr = cookieArr[i].split('='); 21 | if (eleArr[0] === name) { 22 | return decodeURIComponent(eleArr[1]); 23 | } 24 | } 25 | return ''; 26 | }; 27 | -------------------------------------------------------------------------------- /src/time/index.js: -------------------------------------------------------------------------------- 1 | /* 2 | * @Author: wenreq 294491328@qq.com 3 | * @Date: 2022-11-09 22:23:50 4 | * @LastEditors: wenreq 294491328@qq.com 5 | * @LastEditTime: 2022-11-10 21:24:16 6 | * @FilePath: /realize-utils/src/time/index.js 7 | * @Description: esm 8 | * 9 | * Copyright (c) 2022 by wenreq 294491328@qq.com, All Rights Reserved. 10 | */ 11 | export { dateFormater } from './dateFormater'; 12 | export { dateStrFormat } from './dateStrFormat'; 13 | export { formatPassTime } from './formatPassTime'; 14 | export { formatRemainTime } from './formatRemainTime'; 15 | export { isLeapYear } from './isLeapYear'; 16 | export { isSameDay } from './isSameDay'; 17 | export { monthDays } from './monthDays'; 18 | export { timeLeft } from './timeLeft'; 19 | export { twoDateBetweenAllDay } from './twoDateBetweenAllDay'; 20 | export { twoDaysBetweenNum } from './twoDaysBetweenNum'; 21 | -------------------------------------------------------------------------------- /src/index.js: -------------------------------------------------------------------------------- 1 | /* 2 | * @Author: wenreq 294491328@qq.com 3 | * @Date: 2022-11-09 21:49:06 4 | * @LastEditors: wenreq 294491328@qq.com 5 | * @LastEditTime: 2022-11-10 23:01:53 6 | * @FilePath: /realize-utils/src/index.js 7 | * @Description: 入口 8 | * 9 | * Copyright (c) 2022 by wenreq 294491328@qq.com, All Rights Reserved. 10 | */ 11 | export * from './array/index'; 12 | export * from './class/index'; 13 | export * from './cookie/index'; 14 | export * from './device/index'; 15 | export * from './dom/index'; 16 | export * from './function/index'; 17 | export * from './keycode/index'; 18 | export * from './number/index'; 19 | export * from './object/index'; 20 | export * from './random/index'; 21 | export * from './regexp/index'; 22 | export * from './screen/index'; 23 | export * from './storage/index'; 24 | export * from './string/index'; 25 | export * from './support/index'; 26 | export * from './url/index'; 27 | export * from './time/index'; 28 | -------------------------------------------------------------------------------- /src/support/downloadFile.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 描述: base64数据导出文件,文件下载 3 | * @date 2022-08-16 4 | * @param {String} filename 文件名 5 | * @param {base64} data Base64 数据 6 | */ 7 | export let downloadFile = function downloadFile(filename, data) { 8 | let downloadLink = document.createElement('a'); 9 | if (downloadLink) { 10 | document.body.appendChild(downloadLink); 11 | downloadLink.style.display = 'none'; 12 | downloadLink.download = filename; 13 | downloadLink.href = data; 14 | if (downloadLink.createEvent) { 15 | let downloadEvt = document.createEvent('MouseEvents'); 16 | downloadEvt.initEvent('click', true, false); 17 | downloadEvt.dispatchEvent(downloadEvt); 18 | } else if (document.createEventObject) { 19 | downloadLink.fireEvent('onclick'); 20 | } else if (typeof downloadLink.onclick == 'function') { 21 | downloadLink.onclick(); 22 | } 23 | document.body.removeChild(downloadLink); 24 | } 25 | }; 26 | -------------------------------------------------------------------------------- /src/time/dateFormater.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 格式化时间 3 | * @date 2022-08-07 4 | * @param {String} formater 格式化格式 'YYYY-MM-DD HH:mm:ss' 'YYYY-MM-DD' 'YYYYMMDDHHmm' 5 | * @param {Date | String} t 可以不传,不传默认 new Date()。 6 | * @returns {String} 格式化后的日期字符串 7 | * @example dateFormater('YYYY-MM-DD', '2020.11.29') => '2020-11-29' 8 | */ 9 | export let dateFormater = function dateFormater(formater, t) { 10 | let date = t ? new Date(t) : new Date(), 11 | Y = date.getFullYear() + '', 12 | M = date.getMonth() + 1, 13 | D = date.getDate(), 14 | H = date.getHours(), 15 | m = date.getMinutes(), 16 | s = date.getSeconds(); 17 | return formater 18 | .replace(/YYYY|yyyy/g, Y) 19 | .replace(/YY|yy/g, Y.substring(2, 4)) 20 | .replace(/MM/g, (M < 10 ? '0' : '') + M) 21 | .replace(/DD/g, (D < 10 ? '0' : '') + D) 22 | .replace(/HH|hh/g, (H < 10 ? '0' : '') + H) 23 | .replace(/mm/g, (m < 10 ? '0' : '') + m) 24 | .replace(/ss/g, (s < 10 ? '0' : '') + s); 25 | }; 26 | -------------------------------------------------------------------------------- /src/array/equalityArray.js: -------------------------------------------------------------------------------- 1 | /* 2 | * @Author: wenreq 294491328@qq.com 3 | * @Date: 2022-11-09 21:17:24 4 | * @LastEditors: wenreq 294491328@qq.com 5 | * @LastEditTime: 2022-11-10 22:57:46 6 | * @FilePath: /realize-utils/src/array/equalityArray.js 7 | * @Description: 8 | * 9 | * Copyright (c) 2022 by wenreq 294491328@qq.com, All Rights Reserved. 10 | */ 11 | /** 12 | * 判断两个数组是否相等 13 | * @date 2022-02-18 14 | * @param {Array} array1 第一个需要对比的数组 15 | * @param {Array} array2 第二个需要对比的数组 16 | * @returns {Boolean} 17 | */ 18 | export let equalityArray = function equalityArray(array1, array2) { 19 | // 直接判读,两个不相等,则不相等。 20 | if (array1 === array2) { 21 | return true; 22 | } 23 | // 判断length,不相等,则不相等。 24 | if (array1.length !== array2.length) { 25 | return false; 26 | } 27 | // 循环判断各项,如有一项不相等,则不相等。 28 | for (let i = 0; i < array1.length; i++) { 29 | if (array1[i] !== array2[i]) { 30 | return false; 31 | } 32 | } 33 | // 否则,则是相等的。 34 | return true; 35 | }; 36 | -------------------------------------------------------------------------------- /src/dom/windowResize.js: -------------------------------------------------------------------------------- 1 | /* 2 | * @Author: wenreq 294491328@qq.com 3 | * @Date: 2022-11-09 21:17:24 4 | * @LastEditors: wenreq 294491328@qq.com 5 | * @LastEditTime: 2022-11-10 22:48:45 6 | * @FilePath: /realize-utils/src/dom/windowResize.js 7 | * @Description: 8 | * 9 | * Copyright (c) 2022 by wenreq 294491328@qq.com, All Rights Reserved. 10 | */ 11 | /** 12 | * H5软键盘缩回、弹起回调 13 | * 当软件键盘弹起会改变当前 window.innerHeight, 监听这个值变化 14 | * @date 2022-02-24 15 | * @param {Function} downCb 当软键盘弹起后,缩回的回调 16 | * @param {any} upCb 当软键盘弹起的回调 17 | */ 18 | export let windowResize = function windowResize(downCb, upCb) { 19 | var clientHeight = window.innerHeight; 20 | downCb = typeof downCb === 'function' ? downCb : function () {}; 21 | upCb = typeof upCb === 'function' ? upCb : function () {}; 22 | window.addEventListener('resize', () => { 23 | var height = window.innerHeight; 24 | if (height === clientHeight) { 25 | downCb(); 26 | } 27 | if (height < clientHeight) { 28 | upCb(); 29 | } 30 | }); 31 | }; 32 | -------------------------------------------------------------------------------- /src/function/debounce.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 防抖: 保证一个函数在多少毫秒内不再被触发,只会执行一次。 3 | * @date 2022-02-24 4 | * @param {Function} func 逻辑函数 5 | * @param {Number} wait 执行逻辑的间隔(毫秒) 6 | * @param {Boolean} immediate 是否立即执行 7 | */ 8 | 9 | // timeout接收setTimeout返回的唯一值,result接收最终返回值 10 | // 定时器的声明不能放在函数内部,否则将会持续新建函数,造成多次执行问题 11 | let timeout, result; 12 | 13 | export let debounce = function debounce(func, wait, immediate) { 14 | let debounced = function () { 15 | let context = this; //将this用context接收 16 | let args = arguments; //将arguments用args接收 17 | 18 | if (timeout) clearTimeout(timeout); //如果有timeout在执行,清除它 19 | if (immediate) { 20 | let callNow = !timeout; // 是否需要绑定this指向,和arguments 21 | timeout = setTimeout(function () { 22 | // 设置一个 23 | timeout = null; 24 | }, wait); 25 | if (callNow) result = func.apply(context, args); 26 | } else { 27 | // 如果不用立即执行的话 28 | timeout = setTimeout(function () { 29 | func.apply(context, args); 30 | }, wait); 31 | } 32 | return result; 33 | }; 34 | 35 | return debounced(); 36 | }; 37 | -------------------------------------------------------------------------------- /src/time/timeLeft.js: -------------------------------------------------------------------------------- 1 | /** 2 | * ${startTime - endTime}的剩余时间,startTime大于endTime时,均返回0 3 | * @param { Date | String } startTime 4 | * @param { Date | String } endTime 5 | * @returns { Object } { d, h, m, s } 天 时 分 秒 6 | */ 7 | export let timeLeft = function timeLeft(startTime, endTime) { 8 | if (!startTime || !endTime) { 9 | return; 10 | } 11 | var startDate, endDate; 12 | if (startTime instanceof Date) { 13 | startDate = startTime; 14 | } else { 15 | startDate = new Date(startTime.replace(/-/g, '/')); //开始时间 16 | } 17 | if (endTime instanceof Date) { 18 | endDate = endTime; 19 | } else { 20 | endDate = new Date(endTime.replace(/-/g, '/')); //结束时间 21 | } 22 | var t = endDate.getTime() - startDate.getTime(); 23 | var d = 0, 24 | h = 0, 25 | m = 0, 26 | s = 0; 27 | if (t >= 0) { 28 | d = Math.floor(t / 1000 / 3600 / 24); 29 | h = Math.floor((t / 1000 / 60 / 60) % 24); 30 | m = Math.floor((t / 1000 / 60) % 60); 31 | s = Math.floor((t / 1000) % 60); 32 | } 33 | return { 34 | d, 35 | h, 36 | m, 37 | s, 38 | }; 39 | }; 40 | -------------------------------------------------------------------------------- /src/url/parseQueryString.js: -------------------------------------------------------------------------------- 1 | /* 2 | * @Author: wenreq 294491328@qq.com 3 | * @Date: 2022-11-09 21:17:24 4 | * @LastEditors: wenreq 294491328@qq.com 5 | * @LastEditTime: 2022-11-09 22:23:02 6 | * @FilePath: /realize-utils/src/url/parseQueryString.js 7 | * @Description: esm 8 | * 9 | * Copyright (c) 2022 by wenreq 294491328@qq.com, All Rights Reserved. 10 | */ 11 | /** 12 | * url参数转对象 13 | * @date 2022-02-27 14 | * @param {String} url default: window.location.href 15 | * @returns {Object} 16 | */ 17 | export let parseQueryString = function parseQueryString(url) { 18 | url = !url ? window.location.href : url; 19 | if (url.indexOf('?') === -1) { 20 | return {}; 21 | } 22 | var search = 23 | url[0] === '?' ? url.substr(1) : url.substring(url.lastIndexOf('?') + 1); 24 | if (search === '') { 25 | return {}; 26 | } 27 | search = search.split('&'); 28 | var query = {}; 29 | for (let i = 0; i < search.length; i++) { 30 | var pair = search[i].split('='); 31 | query[decodeURIComponent(pair[0])] = decodeURIComponent(pair[1] || ''); 32 | } 33 | return query; 34 | }; 35 | -------------------------------------------------------------------------------- /src/url/stringifyQueryString.js: -------------------------------------------------------------------------------- 1 | /* 2 | * @Author: wenreq 294491328@qq.com 3 | * @Date: 2022-11-09 21:17:24 4 | * @LastEditors: wenreq 294491328@qq.com 5 | * @LastEditTime: 2022-11-09 22:26:06 6 | * @FilePath: /realize-utils/src/url/stringifyQueryString.js 7 | * @Description: esm 8 | * 9 | * Copyright (c) 2022 by wenreq 294491328@qq.com, All Rights Reserved. 10 | */ 11 | /** 12 | * 对象序列化 13 | * @date 2022-02-27 14 | * @param {Object} obj 15 | * @returns {String} 16 | */ 17 | export let stringifyQueryString = function stringifyQueryString(obj) { 18 | if (!obj) return ''; 19 | var pairs = []; 20 | 21 | for (var key in obj) { 22 | var value = obj[key]; 23 | if (value instanceof Array) { 24 | for (var i = 0; i < value.length; ++i) { 25 | pairs.push( 26 | encodeURIComponent(key + '[' + i + ']') + 27 | '=' + 28 | encodeURIComponent(value[i]) 29 | ); 30 | } 31 | continue; 32 | } 33 | pairs.push(encodeURIComponent(key) + '=' + encodeURIComponent(obj[key])); 34 | } 35 | 36 | return pairs.join('&'); 37 | }; 38 | -------------------------------------------------------------------------------- /src/array/subArray.js: -------------------------------------------------------------------------------- 1 | /* 2 | * @Author: wenreq 294491328@qq.com 3 | * @Date: 2022-11-09 21:17:24 4 | * @LastEditors: wenreq 294491328@qq.com 5 | * @LastEditTime: 2022-11-10 22:57:07 6 | * @FilePath: /realize-utils/src/array/subArray.js 7 | * @Description: 8 | * 9 | * Copyright (c) 2022 by wenreq 294491328@qq.com, All Rights Reserved. 10 | */ 11 | /** 12 | * 数组相减 13 | * 例如有两个数组 14 | * const arr1 = [1, 2, 3, 4, 5, 6] 和 const arr2 = [1, 2, 3] 15 | * 那么这时候需要第一个数组减去第二个数组中的项,返回剩下的项 16 | * 使用 subArray(arr1, arr2) 就可以解决这个问题 17 | * 返回 [4, 5, 6] 18 | * @date 2022-02-23 19 | * @param {Array} array1 要处理的数组 20 | * @param {Array} array2 要处理的数组 21 | * @returns {Array} 相减后的数组 22 | */ 23 | export let subArray = function subArray(array1, array2) { 24 | if (array1.length > array2.length) { 25 | return array1.filter((item1) => { 26 | return !array2.find((item2) => { 27 | return item1 === item2; 28 | }); 29 | }); 30 | } else { 31 | return array2.filter((item1) => { 32 | return !array1.find((item2) => { 33 | return item1 === item2; 34 | }); 35 | }); 36 | } 37 | }; 38 | -------------------------------------------------------------------------------- /src/time/dateStrFormat.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 将指定字符串由一种时间格式转化为另一种。from 的格式应对应 str 的位置 3 | * @date 2022-08-07 4 | * @param {String} str 原始的日期字符串 5 | * @param {String} from 匹配原始字符串的格式 6 | * @param {String} to 想要转换的日期字符串格式 7 | * @returns {String} 格式化后的日期字符串 8 | * @example 9 | * dateStrForma('20220807', 'YYYYMMDD', 'YYYY年MM月DD日') ==> 2022年08月07日 10 | * dateStrForma('121220220807', '----YYYYMMDD', 'YYYY年MM月DD日') ==> 2022年08月07日 11 | * dateStrForma('2022年08月07日', 'YYYY年MM月DD日', 'YYYYMMDD') ==> 20220807 12 | * 13 | * 一般的也可以使用正则来实现 14 | * '2022年08月07日'.replace(/(\d{4})年(\d{2})月(\d{2})日/, '$1-$2-$3') ==> 2022-08-07 15 | */ 16 | export let dateStrFormat = function dateStrFormat(str, from, to) { 17 | //'20220807' 'YYYYMMDD' 'YYYY年MM月DD日' 18 | str += ''; 19 | let Y = ''; 20 | if (~(Y = from.indexOf('YYYY'))) { 21 | Y = str.substring(Y, Y + 4); 22 | to = to.replace(/YYYY|yyyy/g, Y); 23 | } else if (~(Y = from.indexOf('YY'))) { 24 | Y = str.substring(Y, Y + 2); 25 | to = to.replace(/YY|yy/g, Y); 26 | } 27 | 28 | let k, i; 29 | ['M', 'D', 'H', 'h', 'm', 's'].forEach((s) => { 30 | i = from.indexOf(s + s); 31 | k = ~i ? str.substring(i, i + 2) : ''; 32 | to = to.replace(s + s, k); 33 | }); 34 | return to; 35 | }; 36 | -------------------------------------------------------------------------------- /src/time/twoDateBetweenAllDay.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 根据指定的两个日期,计算并返回中间的所有日期。 3 | * @date 2022-06-09 4 | * @param {String} startDay 开始日期 '2022-06-01' 5 | * @param {String} endDay 结束日期 '2022-06-09' 6 | * @returns {Array} 包含所有日期的集合 ['2022-06-01', '2022-06-02', '2022-06-03', '2022-06-04', '2022-06-05', '2022-06-06', '2022-06-07', '2022-06-08', '2022-06-09'] 7 | */ 8 | export let twoDateBetweenAllDay = function twoDateBetweenAllDay( 9 | startDay, 10 | endDay 11 | ) { 12 | let arr = []; 13 | let dates = []; 14 | // 设置两个日期 UTC 时间 15 | const sd = new Date(startDay); 16 | const ed = new Date(endDay); 17 | // 获取两个日期 GTM 时间 18 | const s = sd.getTime() - 24 * 60 * 60 * 1000; 19 | const e = ed.getTime() - 24 * 60 * 60 * 1000; 20 | // 获取到两个日期之间的每一天的毫秒数 21 | for (let i = s; i <= e; ) { 22 | i = i + 24 * 60 * 60 * 1000; 23 | arr.push(parseInt(i)); 24 | } 25 | // 获取每一天的时间 YY-MM-DD 26 | for (const j in arr) { 27 | const time = new Date(arr[j]); 28 | const year = time.getFullYear(time); 29 | const month = String(time.getMonth() + 1).padStart(2, '0'); 30 | const day = String(time.getDate()).padStart(2, '0'); 31 | const YYMMDD = `${year}-${month}-${day}`; 32 | dates.push(YYMMDD); 33 | } 34 | return dates; 35 | }; 36 | -------------------------------------------------------------------------------- /src/device/getOS.js: -------------------------------------------------------------------------------- 1 | /* 2 | * @Author: wenreq 294491328@qq.com 3 | * @Date: 2022-11-09 21:17:24 4 | * @LastEditors: wenreq 294491328@qq.com 5 | * @LastEditTime: 2022-11-10 22:52:12 6 | * @FilePath: /realize-utils/src/device/getOS.js 7 | * @Description: 8 | * 9 | * Copyright (c) 2022 by wenreq 294491328@qq.com, All Rights Reserved. 10 | */ 11 | /** 12 | * 获取操作系统类型 13 | * @date 2022-02-23 14 | * @returns {String} 操作系统类型 15 | */ 16 | export let getOS = function getOS() { 17 | var userAgent = 18 | ('navigator' in window && 19 | 'userAgent' in navigator && 20 | navigator.userAgent.toLowerCase()) || 21 | ''; 22 | var appVersion = 23 | ('navigator' in window && 24 | 'appVersion' in navigator && 25 | navigator.appVersion.toLowerCase()) || 26 | ''; 27 | 28 | if ( 29 | /iphone/i.test(userAgent) || 30 | /ipad/i.test(userAgent) || 31 | /ipod/i.test(userAgent) 32 | ) 33 | return 'ios'; 34 | if (/android/i.test(userAgent)) return 'android'; 35 | if (/win/i.test(appVersion) && /phone/i.test(userAgent)) 36 | return 'windowsPhone'; 37 | if (/mac/i.test(appVersion)) return 'MacOSX'; 38 | if (/win/i.test(appVersion)) return 'windows'; 39 | if (/linux/i.test(appVersion)) return 'linux'; 40 | }; 41 | -------------------------------------------------------------------------------- /src/object/mergeObject.js: -------------------------------------------------------------------------------- 1 | /* 2 | * @Author: wenreq 294491328@qq.com 3 | * @Date: 2022-11-10 23:21:56 4 | * @LastEditors: wenreq 294491328@qq.com 5 | * @LastEditTime: 2022-11-12 00:00:48 6 | * @FilePath: /realize-utils/src/object/mergeObject.js 7 | * @Description: 8 | * 9 | * Copyright (c) 2022 by wenreq 294491328@qq.com, All Rights Reserved. 10 | */ 11 | /** 12 | * 合并对象 13 | * date:2022-8-30 14 | * @param {Object} target 目标对象 15 | * @param {Object} source 源对象 16 | * @returns {Object} 17 | */ 18 | export let mergeObject = function mergeObject(target, source) { 19 | //检测target是不是对象 20 | if (target === null || typeof target !== 'object') { 21 | target = {}; 22 | } 23 | // 如果值是Array类型直接返回 24 | if (Array.isArray(source)) { 25 | return source.slice(); 26 | } 27 | let sourcePropValue = null; 28 | Object.keys(source).forEach(function (prop) { 29 | sourcePropValue = source[prop]; 30 | if (sourcePropValue && typeof sourcePropValue === 'object') { 31 | target[prop] = mergeObject(target[prop], sourcePropValue); 32 | } 33 | if (Object.prototype.hasOwnProperty.call(target, prop)) { 34 | target[prop] = [].concat(target[prop], sourcePropValue); 35 | } else { 36 | target[prop] = sourcePropValue; 37 | } 38 | }); 39 | return target; 40 | }; 41 | -------------------------------------------------------------------------------- /src/object/deepClone.js: -------------------------------------------------------------------------------- 1 | const isComplexDataType = (obj) => 2 | (typeof obj === 'object' || typeof obj === 'function') && obj !== null; 3 | 4 | /** 5 | * 深拷贝, 支持各种复杂类型 6 | * @date 2022-02-25 7 | * @param {any} obj 8 | * @param {any} hash=newWeakMap() 9 | * @returns {any} 拷贝后的对象 10 | */ 11 | 12 | /* 13 | 1、 不可枚举的属性 及 Symbol 类型。 可以使用 Reflect.ownKeys 方法; 14 | 2、 判断参数是 Date、 RegExp 类型, 则直接生成一个新的实例返回; 15 | 3、 利用 Object.getOwnPropertyDescriptors() 获得对象的所有属性 以及 对应 的特性, 结合 Object.create() 创建一个新的对象, 并继承传入原对象的原型链; 16 | 4、 利用 WeakMap 类型作为 Hash 表, 因为 WeakMap 是弱引用类型, 可以 防止内存泄漏, 作为检测循环引用很有帮组, 如果循环引用则返回 WeakMap 存储的值。 17 | */ 18 | export let deepClone = function deepClone(obj, hash = new WeakMap()) { 19 | if (obj.constructor === Date) return new Date(obj); // 日期对象直接返回一个新的日期对象 20 | if (obj.constructor === RegExp) return new RegExp(obj); // 正则对象直接返回一个新的正则对象 21 | if (hash.has(obj)) return hash.get(obj); // 如果循环引用了就用 WeakMap 来解决 22 | let allDesc = Object.getOwnPropertyDescriptors(obj); // 获得对象的所有属性及对应的特性 23 | let cloneObj = Object.create(Object.getPrototypeOf(obj), allDesc); // 创建一个新的对象,并继承传入原对象的原型链 24 | hash.set(obj, cloneObj); // 继承原型链 25 | for (let key of Reflect.ownKeys(obj)) { 26 | // 不可枚举的属性及Symbol类型,用Reflect.ownKeys() 27 | cloneObj[key] = 28 | isComplexDataType(obj[key]) && typeof obj[key] !== 'function' 29 | ? deepClone(obj[key], hash) 30 | : obj[key]; 31 | } 32 | return cloneObj; 33 | }; 34 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "realize-utils", 3 | "version": "2.0.9", 4 | "description": "前端函数工具库", 5 | "main": "./lib/realize-utils.cjs.js", 6 | "jsnext:main": "./lib/realize-utils.esm.js", 7 | "module": "./lib/realize-utils.esm.js", 8 | "browser": "./lib/realize-utils.browser.js", 9 | "type": "module", 10 | "scripts": { 11 | "build": "rollup -c", 12 | "dev": "rollup -c -w", 13 | "eslint": "eslint . --ext .js --fix", 14 | "lint": "npx prettier --write . && eslint . --ext .js --fix", 15 | "prepublishOnly": "npm run build", 16 | "echo": "echo hello", 17 | "preecho": "echo 'hello -> Before'", 18 | "postecho": "echo 'hello -> After'" 19 | }, 20 | "files": [ 21 | "lib" 22 | ], 23 | "repository": { 24 | "type": "git", 25 | "url": "git+https://github.com/wenreq/realize-utils" 26 | }, 27 | "keywords": [ 28 | "utils", 29 | "deepClone", 30 | "debounce", 31 | "throttle" 32 | ], 33 | "author": "wen", 34 | "license": "ISC", 35 | "devDependencies": { 36 | "@babel/core": "^7.20.2", 37 | "@babel/preset-env": "^7.20.2", 38 | "@rollup/plugin-babel": "^6.0.2", 39 | "@rollup/plugin-node-resolve": "^15.0.1", 40 | "eslint": "^8.9.0", 41 | "eslint-config-prettier": "^8.5.0", 42 | "eslint-plugin-prettier": "^4.2.1", 43 | "prettier": "^2.7.1", 44 | "rollup": "^2.0.0", 45 | "rollup-plugin-terser": "^7.0.2" 46 | }, 47 | "engines": { 48 | "node": ">=16.13.2" 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /src/string/digitUppercase.js: -------------------------------------------------------------------------------- 1 | /* 2 | * @Author: wenreq 294491328@qq.com 3 | * @Date: 2022-11-10 23:22:07 4 | * @LastEditors: wenreq 294491328@qq.com 5 | * @LastEditTime: 2022-11-13 14:01:49 6 | * @FilePath: /realize-utils/src/string/digitUppercase.js 7 | * @Description: 8 | * 9 | * Copyright (c) 2022 by wenreq 294491328@qq.com, All Rights Reserved. 10 | */ 11 | /** 12 | * 现金额转大写 13 | * @date 2022-02-27 14 | * @param {Number} n 15 | * @returns {String} 16 | */ 17 | export let digitUppercase = function digitUppercase(n) { 18 | var fraction = ['角', '分']; 19 | var digit = ['零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖']; 20 | var unit = [ 21 | ['元', '万', '亿'], 22 | ['', '拾', '佰', '仟'], 23 | ]; 24 | var head = n < 0 ? '欠' : ''; 25 | n = Math.abs(n); 26 | var s = ''; 27 | for (var i = 0; i < fraction.length; i++) { 28 | s += ( 29 | digit[Math.floor(n * 10 * Math.pow(10, i)) % 10] + fraction[i] 30 | ).replace(/零./, ''); 31 | } 32 | s = s || '整'; 33 | n = Math.floor(n); 34 | for (var i = 0; i < unit[0].length && n > 0; i++) { 35 | var p = ''; 36 | for (var j = 0; j < unit[1].length && n > 0; j++) { 37 | p = digit[n % 10] + unit[1][j] + p; 38 | n = Math.floor(n / 10); 39 | } 40 | s = p.replace(/(零.)*零$/, '').replace(/^$/, '零') + unit[0][i] + s; 41 | } 42 | return ( 43 | head + 44 | s 45 | .replace(/(零.)*零元/, '元') 46 | .replace(/(零.)+/g, '零') 47 | .replace(/^整$/, '零元整') 48 | ); 49 | }; 50 | -------------------------------------------------------------------------------- /src/device/getExplore.js: -------------------------------------------------------------------------------- 1 | /* 2 | * @Author: wenreq 294491328@qq.com 3 | * @Date: 2022-11-09 21:17:24 4 | * @LastEditors: wenreq 294491328@qq.com 5 | * @LastEditTime: 2022-11-11 23:49:16 6 | * @FilePath: /realize-utils/src/device/getExplore.js 7 | * @Description: 8 | * 9 | * Copyright (c) 2022 by wenreq 294491328@qq.com, All Rights Reserved. 10 | */ 11 | /** 12 | * 获取浏览器类型和版本 13 | * @date 2022-02-23 14 | * @returns {String} '类型:版本' 15 | */ 16 | export let getExplore = function getExplore() { 17 | var sys = {}, 18 | ua = navigator.userAgent.toLowerCase(), 19 | s; 20 | // IE - rv:11.0) like Gecko 21 | (s = ua.match(/rv:([\d.]+)\) like gecko/)) 22 | ? (sys.ie = s[1]) 23 | : (s = ua.match(/msie ([\d\.]+)/)) 24 | ? (sys.ie = s[1]) 25 | : (s = ua.match(/edge\/([\d\.]+)/)) 26 | ? (sys.edge = s[1]) 27 | : (s = ua.match(/firefox\/([\d\.]+)/)) 28 | ? (sys.firefox = s[1]) 29 | : (s = ua.match(/(?:opera|opr).([\d\.]+)/)) 30 | ? (sys.opera = s[1]) 31 | : (s = ua.match(/chrome\/([\d\.]+)/)) 32 | ? (sys.chrome = s[1]) 33 | : (s = ua.match(/version\/([\d\.]+).*safari/)) 34 | ? (sys.safari = s[1]) 35 | : 0; 36 | 37 | // 根据关系进行判断 38 | if (sys.ie) return 'IE:' + sys.ie; 39 | if (sys.edge) return 'EDGE: ' + sys.edge; 40 | if (sys.firefox) return 'Firefox: ' + sys.firefox; 41 | if (sys.chrome) return 'Chrome: ' + sys.chrome; 42 | if (sys.opera) return 'Opera: ' + sys.opera; 43 | if (sys.safari) return 'Safari: ' + sys.safari; 44 | return 'unknown'; 45 | }; 46 | -------------------------------------------------------------------------------- /src/dom/scrollTo.js: -------------------------------------------------------------------------------- 1 | /* 2 | * @Author: wenreq 294491328@qq.com 3 | * @Date: 2022-11-09 21:17:24 4 | * @LastEditors: wenreq 294491328@qq.com 5 | * @LastEditTime: 2022-11-11 21:25:36 6 | * @FilePath: /realize-utils/src/dom/scrollTo.js 7 | * @Description: 8 | * 9 | * Copyright (c) 2022 by wenreq 294491328@qq.com, All Rights Reserved. 10 | */ 11 | import { getScrollTop } from './getScrollTop'; 12 | import { setScrollTop } from './setScrollTop'; 13 | var requestAnimFrame = (function () { 14 | // window.requestAnimationFrame 要求浏览器在下次重绘之前调用指定的回调函数更新动画。 15 | return ( 16 | window.requestAnimationFrame || 17 | window.webkitRequestAnimationFrame || 18 | function (callback) { 19 | window.setTimeout(callback, 1000 / 60); 20 | } 21 | ); 22 | })(); 23 | 24 | /** 25 | * 在 duration 时间内,滚动条平滑滚动到 to 指定位置 26 | * @date 2022-02-24 27 | * @param {Number} to 滚动位置的值 28 | * @param {Number} duration 时间-毫秒数 29 | */ 30 | export let scrollTo = function scrollTo(to, duration) { 31 | if (duration < 0) { 32 | setScrollTop(to); 33 | return; 34 | } 35 | var diff = to - getScrollTop(); 36 | if (diff === 0) return; 37 | var step = (diff / duration) * 10; 38 | requestAnimFrame(function () { 39 | if (Math.abs(step) > Math.abs(diff)) { 40 | setScrollTop(getScrollTop() + diff); 41 | return; 42 | } 43 | setScrollTop(getScrollTop() + step); 44 | if ( 45 | (diff > 0 && getScrollTop() >= to) || 46 | (diff < 0 && getScrollTop() <= to) 47 | ) { 48 | return; 49 | } 50 | scrollTo(to, duration - 16); 51 | }); 52 | }; 53 | -------------------------------------------------------------------------------- /src/keycode/getKeyName.js: -------------------------------------------------------------------------------- 1 | var keyCodeMap = { 2 | 8: 'Backspace', 3 | 9: 'Tab', 4 | 13: 'Enter', 5 | 16: 'Shift', 6 | 17: 'Ctrl', 7 | 18: 'Alt', 8 | 19: 'Pause', 9 | 20: 'Caps Lock', 10 | 27: 'Escape', 11 | 32: 'Space', 12 | 33: 'Page Up', 13 | 34: 'Page Down', 14 | 35: 'End', 15 | 36: 'Home', 16 | 37: 'Left', 17 | 38: 'Up', 18 | 39: 'Right', 19 | 40: 'Down', 20 | 42: 'Print Screen', 21 | 45: 'Insert', 22 | 46: 'Delete', 23 | 24 | 48: '0', 25 | 49: '1', 26 | 50: '2', 27 | 51: '3', 28 | 52: '4', 29 | 53: '5', 30 | 54: '6', 31 | 55: '7', 32 | 56: '8', 33 | 57: '9', 34 | 35 | 65: 'A', 36 | 66: 'B', 37 | 67: 'C', 38 | 68: 'D', 39 | 69: 'E', 40 | 70: 'F', 41 | 71: 'G', 42 | 72: 'H', 43 | 73: 'I', 44 | 74: 'J', 45 | 75: 'K', 46 | 76: 'L', 47 | 77: 'M', 48 | 78: 'N', 49 | 79: 'O', 50 | 80: 'P', 51 | 81: 'Q', 52 | 82: 'R', 53 | 83: 'S', 54 | 84: 'T', 55 | 85: 'U', 56 | 86: 'V', 57 | 87: 'W', 58 | 88: 'X', 59 | 89: 'Y', 60 | 90: 'Z', 61 | 62 | 91: 'Windows', 63 | 93: 'Right Click', 64 | 65 | 96: 'Numpad 0', 66 | 97: 'Numpad 1', 67 | 98: 'Numpad 2', 68 | 99: 'Numpad 3', 69 | 100: 'Numpad 4', 70 | 101: 'Numpad 5', 71 | 102: 'Numpad 6', 72 | 103: 'Numpad 7', 73 | 104: 'Numpad 8', 74 | 105: 'Numpad 9', 75 | 106: 'Numpad *', 76 | 107: 'Numpad +', 77 | 109: 'Numpad -', 78 | 110: 'Numpad .', 79 | 111: 'Numpad /', 80 | 81 | 112: 'F1', 82 | 113: 'F2', 83 | 114: 'F3', 84 | 115: 'F4', 85 | 116: 'F5', 86 | 117: 'F6', 87 | 118: 'F7', 88 | 119: 'F8', 89 | 120: 'F9', 90 | 121: 'F10', 91 | 122: 'F11', 92 | 123: 'F12', 93 | 94 | 144: 'Num Lock', 95 | 145: 'Scroll Lock', 96 | 182: 'My Computer', 97 | 183: 'My Calculator', 98 | 186: ';', 99 | 187: '=', 100 | 188: ',', 101 | 189: '-', 102 | 190: '.', 103 | 191: '/', 104 | 192: '`', 105 | 219: '[', 106 | 220: '\\', 107 | 221: ']', 108 | 222: "'", 109 | }; 110 | /** 111 | * @desc 根据keycode获得键名 112 | * @param {Number} keycode 113 | * @return {String} 114 | */ 115 | export let getKeyName = function getKeyName(keycode) { 116 | if (keyCodeMap[keycode]) { 117 | return keyCodeMap[keycode]; 118 | } else { 119 | console.log('Unknow Key(Key Code:' + keycode + ')'); 120 | return ''; 121 | } 122 | }; 123 | -------------------------------------------------------------------------------- /rollup.config.js: -------------------------------------------------------------------------------- 1 | /* 2 | * @Author: wenreq 294491328@qq.com 3 | * @Date: 2022-11-09 21:49:35 4 | * @LastEditors: wenreq 294491328@qq.com 5 | * @LastEditTime: 2022-11-11 23:38:03 6 | * @FilePath: /realize-utils/rollup.config.js 7 | * @Description: 8 | * 9 | * Copyright (c) 2022 by wenreq 294491328@qq.com, All Rights Reserved. 10 | */ 11 | 12 | import { nodeResolve } from '@rollup/plugin-node-resolve'; 13 | import { terser } from 'rollup-plugin-terser'; 14 | import babel from '@rollup/plugin-babel'; 15 | import pkg from './package.json'; 16 | const libName = 'realize'; 17 | 18 | module.exports = { 19 | input: './src/index.js', 20 | output: [ 21 | { 22 | file: pkg.browser, // 输出路径 23 | format: 'umd', // 输出的模块协议 umd 24 | name: libName, 25 | exports: 'named', 26 | sourcemap: true, 27 | esModule: false, 28 | }, 29 | { 30 | file: pkg.module, // 输出路径 31 | format: 'esm', // 输出的模块协议 esm 32 | exports: 'named', 33 | sourcemap: true, 34 | }, 35 | { 36 | file: pkg.main, // 输出路径 37 | format: 'cjs', // 输出的模块协议 cjs 38 | exports: 'named', 39 | sourcemap: true, 40 | }, 41 | ], 42 | plugins: [ 43 | nodeResolve(), 44 | babel({ 45 | babelHelpers: 'bundled', 46 | exclude: 'node_modules/**', // 指定哪些文件夹时不进行babel编译的 47 | }), 48 | terser(), 49 | ], 50 | external: ['decimal.js'], //表示哪些模块是外部引用, 即使开启了 resolve 这里面的模块仍然是外部引用 51 | }; 52 | 53 | // module.exports = [ 54 | // { 55 | // // UMD 56 | // input, 57 | // plugins: [ 58 | // nodeResolve(), 59 | // babel({ 60 | // babelHelpers: "bundled" 61 | // }), 62 | // terser(), 63 | // ], 64 | // output: { 65 | // file: "lib/realize-utils.browser.js", 66 | // format: "umd", 67 | // name: libName, 68 | // esModule: false, 69 | // exports: "named", 70 | // sourcemap: true, 71 | // } 72 | // }, 73 | // { 74 | // // ESM and CJS 75 | // input, 76 | // plugins: [nodeResolve()], 77 | // output: [ 78 | // { 79 | // dir: "lib/realize-utils.esm.js", 80 | // format: "esm", 81 | // exports: "named", 82 | // sourcemap: true, 83 | // }, 84 | // { 85 | // dir: "lib/realize-utils.cjs.js", 86 | // format: "cjs", 87 | // exports: "named", 88 | // sourcemap: true, 89 | // } 90 | // ] 91 | // } 92 | // ] 93 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | [![realize-utils](http://oss.tianmasport.com/gx/size/2022-02-23/196/946000020912472064.png)](https://github.com/wenreq/realize-utils) 2 | 3 | # realize-utils 4 | 5 | [![npm version](https://img.shields.io/static/v1?label=npm&message=v2.0.8&color=blue)](https://www.npmjs.com/package/realize-utils) 6 | [![license](https://img.shields.io/static/v1?label=license&message=MIT&color=green)](https://www.npmjs.com/package/realize-utils) 7 | 8 | 前端业务代码工具库,支持 UMD、CJS、ESM 多模式和 Tree-Shaking。 9 | 10 | > 目的:高效率完成前端业务代码 11 | 12 | 业务开发过程中,会经常用 13 | 到`日期格式化`、`url参数转对象`、`浏览器类型判断`、`节流函数`等常用函数,为避免 14 | 不同项目多次复制粘贴的麻烦,这里统一封装,并发布到 npm,以提高开发效率。如果你也 15 | 有常用的代码,欢迎为本项目提交 pr 16 | 17 | ## 安装和使用 :wrench: 18 | 19 | ### CDN 20 | 21 | 直接下载 `lib` 目录下的 22 | [realize-utils.browser.js](https://github.com/wenreq/realize-utils/blob/master/lib/realize-utils.browser.js) 23 | 使用,支持 CDN 方式,直接在 html 文件中引入使用。 24 | 25 | ```html 26 | 27 | 34 | ``` 35 | 36 | ### ESM 37 | 38 | 使用 npm 安装。支持 Tree-shaking。 39 | 40 | ```shell 41 | npm i realize-utils -D 42 | ``` 43 | 44 | ```js 45 | import { setStorage, getStorage, uniqueArray } from 'realize-utils'; 46 | setStorage('name', 'wen'); 47 | let name = getStorage('name'); 48 | console.log(name); // wen 49 | 50 | let arr = [1, 3, 5, 1, 2, 3, 5]; 51 | let uniqueArr = uniqueArray(arr); 52 | console.log(uniqueArr); // [1, 3, 5, 2] 53 | ``` 54 | 55 | ### CJS 56 | 57 | 直接下载 `lib` 目录下的 58 | [realize-utils.cjs.js](https://github.com/wenreq/realize-utils/blob/master/lib/realize-utils.cjs.js) 59 | 使用,在 node 环境中引入使用。 60 | 61 | ## npm 链接 :link: 62 | 63 | [realize-utils](https://www.npmjs.com/package/realize-utils) 64 | 65 | ## API 文档 :package: 66 | 67 | ### Array 68 | 69 | - [equalityArray](https://github.com/wenreq/realize-utils/blob/master/src/array/equalityArray.js) 70 | 判读两个数组是否相等 71 | - [mergeArrayDelRepeat](https://github.com/wenreq/realize-utils/blob/master/src/array/mergeArrayDelRepeat.js) 72 | 合并数组后去重 73 | - [uniqueArray](https://github.com/wenreq/realize-utils/blob/master/src/array/uniqueArray.js) 74 | 数组去重 75 | - [subArray](https://github.com/wenreq/realize-utils/blob/master/src/array/subArray.js) 76 | 数组相减 77 | 78 | ### Class 79 | 80 | - [addClass](https://github.com/wenreq/realize-utils/blob/master/src/class/addClass.js) 81 | 为元素添加 class 82 | - [hasClass](https://github.com/wenreq/realize-utils/blob/master/src/class/hasClass.js) 83 | 判断元素是否有某个 class 84 | - [removeClass](https://github.com/wenreq/realize-utils/blob/master/src/class/removeClass.js) 85 | 为元素移除 class 86 | 87 | ### Cookie 88 | 89 | - [getCookie](https://github.com/wenreq/realize-utils/blob/master/src/cookie/getCookie.js) 90 | 根据 name 读取 Cookie 91 | - [setCookie](https://github.com/wenreq/realize-utils/blob/master/src/cookie/setCookie.js) 92 | 根据 name,value,days 设置 Cookie 93 | - [removeCookie](https://github.com/wenreq/realize-utils/blob/master/src/cookie/removeCookie.js) 94 | 根据 name 删除 Cookie 95 | 96 | ### Device 97 | 98 | - [getExplore](https://github.com/wenreq/realize-utils/blob/master/src/device/getExplore.js) 99 | 获取浏览器:版本号 100 | - [getOS](https://github.com/wenreq/realize-utils/blob/master/src/device/getOS.js) 101 | 获取操作系统类型 102 | 103 | ### Dom 104 | 105 | - [getScrollTop](https://github.com/wenreq/realize-utils/blob/master/src/dom/getScrollTop.js) 106 | 获取滚动条距顶部的距离 107 | - [offset](https://github.com/wenreq/realize-utils/blob/master/src/dom/offset.js) 108 | 获取一个元素的距离文档(document)的位置,类似 JQ 中的 offset() ele.offset() 109 | - [scrollTo](https://github.com/wenreq/realize-utils/blob/master/src/dom/scrollTo.js) 110 | 在${duration}时间内,滚动条平滑滚动到${to}指定位置 scrollTo(to, duration) 111 | - [setScrollTop](https://github.com/wenreq/realize-utils/blob/master/src/dom/setScrollTop.js) 112 | 设置滚动条距顶部的距离 113 | - [windowResize](https://github.com/wenreq/realize-utils/blob/master/src/dom/windowResize.js) 114 | H5 软键盘缩回、弹起回调 115 | 116 | ### Function 117 | 118 | - [debounce](https://github.com/wenreq/realize-utils/blob/master/src/function/debounce.js) 119 | 函数防抖 120 | - [throttle](https://github.com/wenreq/realize-utils/blob/master/src/function/throttle.js) 121 | 函数节流 122 | 123 | ### Keycode 124 | 125 | - [getKeyName](https://github.com/wenreq/realize-utils/blob/master/src/keycode/getKeyName.js) 126 | 根据 keycode 获得键名 127 | 128 | ### Number 129 | 130 | - [standardAmount](https://github.com/wenreq/realize-utils/blob/master/src/number/standardAmount.js) 131 | 将数字(整数逢三一断)含小数转换成标准的金额模式,最多保留三位小数 132 | 。standardAmount(999999999.9991) => '999,999,999.999' 133 | - [standardIntegerAmount](https://github.com/wenreq/realize-utils/blob/master/src/number/standardIntegerAmount.js) 134 | 将 "整数" 数字(整数逢三一断)。standardIntegerAmount(99999999999) => 135 | '99,999,999,999' 136 | 137 | ### Object 138 | 139 | - [deepClone](https://github.com/wenreq/realize-utils/blob/master/src/object/deepClone.js) 140 | 对象的深拷贝 141 | - [shallowClone](https://github.com/wenreq/realize-utils/blob/master/src/object/shallowClone.js) 142 | 对象的浅拷贝 143 | - [isEmptyObject](https://github.com/wenreq/realize-utils/blob/master/src/object/isEmptyObject.js) 144 | 判断对象是否为空 145 | - [getFormData](https://github.com/wenreq/realize-utils/blob/master/src/object/getFormData.js) 146 | 将对象转换为 formData 对象 147 | 148 | ### Random 149 | 150 | - [randomColor](https://github.com/wenreq/realize-utils/blob/master/src/random/randomColor.js) 151 | 随机生成颜色 152 | - [randomNum](https://github.com/wenreq/realize-utils/blob/master/src/random/randomNum.js) 153 | 生成指定范围随机数 154 | 155 | ### Regexp 156 | 157 | - [isColor](https://github.com/wenreq/realize-utils/blob/master/src/regexp/isColor.js) 158 | 判断是否为 16 进制颜色,rgb 或 rgba 159 | - [isEmail](https://github.com/wenreq/realize-utils/blob/master/src/regexp/isEmail.js) 160 | 判断是否为邮箱地址 161 | - [isIdCard](https://github.com/wenreq/realize-utils/blob/master/src/regexp/isIdCard.js) 162 | 判断是否为身份证号 163 | - [isPhoneNum](https://github.com/wenreq/realize-utils/blob/master/src/regexp/isPhoneNum.js) 164 | 判断是否为手机号 165 | - [isUrl](https://github.com/wenreq/realize-utils/blob/master/src/regexp/isUrl.js) 166 | 判断是否为 URL 地址 167 | 168 | ### Screen 169 | 170 | - [toFullScreen](https://github.com/wenreq/realize-utils/blob/master/src/screen/toFullScreen.js) 171 | 全屏 toFullScreen() 172 | - [exitFullscreen](https://github.com/wenreq/realize-utils/blob/master/src/screen/exitFullscreen.js) 173 | 退出全屏 exitFullscreen() 174 | 175 | ### Storage 176 | 177 | - [getStorage](https://github.com/wenreq/realize-utils/blob/master/src/storage/index.js) 178 | 根据 name 读取 localStorage 179 | - [setStorage](https://github.com/wenreq/realize-utils/blob/master/src/storage/index.js) 180 | 根据 name,value 添加 localStorage 181 | - [removeStorage](https://github.com/wenreq/realize-utils/blob/master/src/storage/index.js) 182 | 根据 name 删除 localStorage 183 | 184 | ### String 185 | 186 | - [digitUppercase](https://github.com/wenreq/realize-utils/blob/master/src/string/digitUppercase.js) 187 | 现金额转大写 digitUppercase(1314521) => '壹佰叁拾壹万肆仟伍佰贰拾壹元整' 188 | 189 | ### Supprot 190 | 191 | - [isSupportWebP](https://github.com/wenreq/realize-utils/blob/master/src/support/isSupportWebP.js) 192 | 判断浏览器是否支持 webP 格式图片 193 | - [downloadFile](https://github.com/wenreq/realize-utils/blob/master/src/support/downloadFile.js) 194 | base64 数据导出文件,文件下载 downloadFile(filename, data) 195 | 196 | ### Time 197 | 198 | - [dateFormater](https://github.com/wenreq/realize-utils/blob/master/src/time/dateFormater.js) 199 | 格式化时间 dateFormater('YYYY-MM-DD HH:mm') => '2022-08-07 14:40' 200 | dateFormater('YYYY-MM-DD', '2020.11.29') => '2020-11-29' 201 | dateFormater('YYYYMMDDHHmm', '2020-11-29 18:10:07') => '202011291810' 202 | - [dateStrFormat](https://github.com/wenreq/realize-utils/blob/master/src/time/dateStrFormat.js) 203 | 将指定字符串由一种时间格式转化为另一种。dateStrForma('20220807', 'YYYYMMDD', 204 | 'YYYY 年 MM 月 DD 日') ==> 2022 年 08 月 07 日 dateStrForma('2022 年 08 月 07 205 | 日', 'YYYY 年 MM 月 DD 日', 'YYYYMMDD') ==> 20220807 206 | - [formatRemainTime](https://github.com/wenreq/realize-utils/blob/master/src/time/formatRemainTime.js) 207 | 计算一个时间到现在过去了多久 '451 天 15 小时 17 分钟 25 秒' 208 | - [formatPassTime](https://github.com/wenreq/realize-utils/blob/master/src/time/formatPassTime.js) 209 | 计算一个时间到现在过去了多久 '1 年前' '6 个月前' '45 分钟前' 210 | - [isLeapYear](https://github.com/wenreq/realize-utils/blob/master/src/time/isLeapYear.js) 211 | 判断是否为闰年 isLeapYear(2020) => true isLeapYear(2021) => false 212 | isLeapYear(2022) => false 213 | - [isSameDay](https://github.com/wenreq/realize-utils/blob/master/src/time/isSameDay.js) 214 | 判断是否为同一天 isSameDay('2022-08-06', '2022-08-06') => true 215 | - [monthDays(month)](https://github.com/wenreq/realize-utils/blob/master/src/time/monthDays.js) 216 | 获取指定日期月份的总天数 monthDays('2022-08') => 31 monthDays('2022-06') => 30 217 | - [timeLeft(startTime, endTime)](https://github.com/wenreq/realize-utils/blob/master/src/time/timeLeft.js) 218 | 计算${startTime - endTime}的剩余时间 timeLeft('2022-08-06 10:10:10', 219 | '2022-08-10 11:15:15') => {d: 4, h: 1, m: 5, s: 5} // 剩余 4 天 1 小时 5 分 5 220 | 秒 221 | - [twoDateBetweenAllDay(startDay, endDay)](https://github.com/wenreq/realize-utils/blob/master/src/time/twoDateBetweenAllDay.js) 222 | 根据指定的两个日期,计算并返回中间的所有日期 223 | 。twoDateBetweenAllDay('2022-06-01', '2022-06-09') // ['2022-06-01', 224 | '2022-06-02', '2022-06-03', '2022-06-04', '2022-06-05', '2022-06-06', 225 | '2022-06-07', '2022-06-08', '2022-06-09'] 226 | - [twoDaysBetweenNum(startDay, endDay)](https://github.com/wenreq/realize-utils/blob/master/src/time/twoDaysBetweenNum.js) 227 | 计算两个日期之间的天数。 使用场景:距今天已有 N 天 228 | 。twoDaysBetweenNum('2022-06-16', '2022-06-20') // 4 229 | 230 | ### Url 231 | 232 | - [parseQueryString](https://github.com/wenreq/realize-utils/blob/master/src/url/parseQueryString.js) 233 | url 参数转对象 parseQueryString('?a=1&b=2&c=3') => {a: '1', b: '2', c: '3'} 234 | - [stringifyQueryString](https://github.com/wenreq/realize-utils/blob/master/src/url/stringifyQueryString.js) 235 | 对象序列化 stringifyQueryString({a: '1', b: '2', c: '3'}) => 'a=1&b=2&c=3' 236 | -------------------------------------------------------------------------------- /lib/realize-utils.browser.js: -------------------------------------------------------------------------------- 1 | !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).realize={})}(this,(function(e){"use strict";function t(e){return t="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},t(e)}function n(e){return function(e){if(Array.isArray(e))return o(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||r(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function r(e,t){if(e){if("string"==typeof e)return o(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?o(e,t):void 0}}function o(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n=e.length?{done:!0}:{done:!1,value:e[o++]}},e:function(e){throw e},f:a}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var i,u=!0,c=!1;return{s:function(){n=n.call(e)},n:function(){var e=n.next();return u=e.done,e},e:function(e){c=!0,i=e},f:function(){try{u||null==n.return||n.return()}finally{if(c)throw i}}}}var i,u,c=function(e,t){return new RegExp("(\\s|^)"+t+"(\\s|$)").test(e.className)},l=function(e,t,n){var r=new Date;r.setDate(r.getDate()+n),document.cookie=e+"="+t+";expires="+r.toUTCString()},f=function(){return document.documentElement&&document.documentElement.scrollTop||document.body.scrollTop},s=function(e){return window.scrollTo(0,e),e},d=window.requestAnimationFrame||window.webkitRequestAnimationFrame||function(e){window.setTimeout(e,1e3/60)},p={8:"Backspace",9:"Tab",13:"Enter",16:"Shift",17:"Ctrl",18:"Alt",19:"Pause",20:"Caps Lock",27:"Escape",32:"Space",33:"Page Up",34:"Page Down",35:"End",36:"Home",37:"Left",38:"Up",39:"Right",40:"Down",42:"Print Screen",45:"Insert",46:"Delete",48:"0",49:"1",50:"2",51:"3",52:"4",53:"5",54:"6",55:"7",56:"8",57:"9",65:"A",66:"B",67:"C",68:"D",69:"E",70:"F",71:"G",72:"H",73:"I",74:"J",75:"K",76:"L",77:"M",78:"N",79:"O",80:"P",81:"Q",82:"R",83:"S",84:"T",85:"U",86:"V",87:"W",88:"X",89:"Y",90:"Z",91:"Windows",93:"Right Click",96:"Numpad 0",97:"Numpad 1",98:"Numpad 2",99:"Numpad 3",100:"Numpad 4",101:"Numpad 5",102:"Numpad 6",103:"Numpad 7",104:"Numpad 8",105:"Numpad 9",106:"Numpad *",107:"Numpad +",109:"Numpad -",110:"Numpad .",111:"Numpad /",112:"F1",113:"F2",114:"F3",115:"F4",116:"F5",117:"F6",118:"F7",119:"F8",120:"F9",121:"F10",122:"F11",123:"F12",144:"Num Lock",145:"Scroll Lock",182:"My Computer",183:"My Calculator",186:";",187:"=",188:",",189:"-",190:".",191:"/",192:"`",219:"[",220:"\\",221:"]",222:"'"},m=function(e){return("object"===t(e)||"function"==typeof e)&&null!==e};e.addClass=function(e,t){c(e,t)||(e.className+=" "+t)},e.dateFormater=function(e,t){var n=t?new Date(t):new Date,r=n.getFullYear()+"",o=n.getMonth()+1,a=n.getDate(),i=n.getHours(),u=n.getMinutes(),c=n.getSeconds();return e.replace(/YYYY|yyyy/g,r).replace(/YY|yy/g,r.substring(2,4)).replace(/MM/g,(o<10?"0":"")+o).replace(/DD/g,(a<10?"0":"")+a).replace(/HH|hh/g,(i<10?"0":"")+i).replace(/mm/g,(u<10?"0":"")+u).replace(/ss/g,(c<10?"0":"")+c)},e.dateStrFormat=function(e,t,n){e+="";var r,o,a="";return~(a=t.indexOf("YYYY"))?(a=e.substring(a,a+4),n=n.replace(/YYYY|yyyy/g,a)):~(a=t.indexOf("YY"))&&(a=e.substring(a,a+2),n=n.replace(/YY|yy/g,a)),["M","D","H","h","m","s"].forEach((function(a){o=t.indexOf(a+a),r=~o?e.substring(o,o+2):"",n=n.replace(a+a,r)})),n},e.debounce=function(e,t,n){return function(){var r=this,o=arguments;if(i&&clearTimeout(i),n){var a=!i;i=setTimeout((function(){i=null}),t),a&&(u=e.apply(r,o))}else i=setTimeout((function(){e.apply(r,o)}),t);return u}()},e.deepClone=function e(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:new WeakMap;if(t.constructor===Date)return new Date(t);if(t.constructor===RegExp)return new RegExp(t);if(n.has(t))return n.get(t);var r=Object.getOwnPropertyDescriptors(t),o=Object.create(Object.getPrototypeOf(t),r);n.set(t,o);var i,u=a(Reflect.ownKeys(t));try{for(u.s();!(i=u.n()).done;){var c=i.value;o[c]=m(t[c])&&"function"!=typeof t[c]?e(t[c],n):t[c]}}catch(e){u.e(e)}finally{u.f()}return o},e.digitUppercase=function(e){var t=["角","分"],n=["零","壹","贰","叁","肆","伍","陆","柒","捌","玖"],r=[["元","万","亿"],["","拾","佰","仟"]],o=e<0?"欠":"";e=Math.abs(e);for(var a="",i=0;i0;u++){for(var c="",l=0;l0;l++)c=n[e%10]+r[1][l]+c,e=Math.floor(e/10);a=c.replace(/(零.)*零$/,"").replace(/^$/,"零")+r[0][i]+a}return o+a.replace(/(零.)*零元/,"元").replace(/(零.)+/g,"零").replace(/^整$/,"零元整")},e.downloadFile=function(e,t){var n=document.createElement("a");if(n){if(document.body.appendChild(n),n.style.display="none",n.download=e,n.href=t,n.createEvent){var r=document.createEvent("MouseEvents");r.initEvent("click",!0,!1),r.dispatchEvent(r)}else document.createEventObject?n.fireEvent("onclick"):"function"==typeof n.onclick&&n.onclick();document.body.removeChild(n)}},e.equalityArray=function(e,t){if(e===t)return!0;if(e.length!==t.length)return!1;for(var n=0;nMath.abs(r)?s(f()+r):(s(f()+o),r>0&&f()>=t||r<0&&f()<=t||e(t,n-16))}))}}},e.setCookie=l,e.setScrollTop=s,e.setStorage=function(e,n){"object"===t(n)&&(n=JSON.stringify(n)),window.localStorage.setItem(e,n)},e.shallowClone=function(e){if(!(e instanceof Object))throw new Error("请传入对象");var t={};for(var n in e)t[n]=e[n];return t},e.standardAmount=function(e){return e?parseFloat(e).toLocaleString():0===e?"0":"--"},e.standardIntegerAmount=function(e){return e?e.toString().replace(/(\d)(?=(?:\d{3})+$)/g,"$1,"):0===e?"0":"--"},e.stringifyQueryString=function(e){if(!e)return"";var t=[];for(var n in e){var r=e[n];if(r instanceof Array)for(var o=0;ot.length?e.filter((function(e){return!t.find((function(t){return e===t}))})):t.filter((function(t){return!e.find((function(e){return t===e}))}))},e.throttle=function(e,t){var n=this,r=arguments.length>2&&void 0!==arguments[2]&&arguments[2],o=null;return function(){for(var a=arguments.length,i=new Array(a),u=0;u=0&&(o=Math.floor(r/1e3/3600/24),a=Math.floor(r/1e3/60/60%24),i=Math.floor(r/1e3/60%60),u=Math.floor(r/1e3%60)),{d:o,h:a,m:i,s:u}}},e.toFullScreen=function(){var e=document.body;e.webkitRequestFullScreen?e.webkitRequestFullScreen():e.mozRequestFullScreen?e.mozRequestFullScreen():e.msRequestFullscreen?e.msRequestFullscreen():e.requestFullScreen?e.requestFullScreen():alert("浏览器不支持全屏")},e.twoDateBetweenAllDay=function(e,t){for(var n=[],r=[],o=new Date(e),a=new Date(t),i=o.getTime()-864e5,u=a.getTime()-864e5,c=i;c<=u;)c+=864e5,n.push(parseInt(c));for(var l in n){var f=new Date(n[l]),s=f.getFullYear(f),d=String(f.getMonth()+1).padStart(2,"0"),p=String(f.getDate()).padStart(2,"0"),m="".concat(s,"-").concat(d,"-").concat(p);r.push(m)}return r},e.twoDaysBetweenNum=function(e,t){if(""===e||null==e||""===t||null==t)return null;var n=Date.parse(e),r=Date.parse(t);return n==r?0:(r-n)/864e5},e.uniqueArray=function(e){if(!Array.isArray(e))throw new Error("第一个参数必须是数组");return 1==e.length?e:n(new Set(e))},e.windowResize=function(e,t){var n=window.innerHeight;e="function"==typeof e?e:function(){},t="function"==typeof t?t:function(){},window.addEventListener("resize",(function(){var r=window.innerHeight;r===n&&e(),re.length)&&(t=e.length);for(var n=0,r=new Array(t);n=e.length?{done:!0}:{done:!1,value:e[o++]}},e:function(e){throw e},f:a}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var i,u=!0,c=!1;return{s:function(){n=n.call(e)},n:function(){var e=n.next();return u=e.done,e},e:function(e){c=!0,i=e},f:function(){try{u||null==n.return||n.return()}finally{if(c)throw i}}}}var i,u,c=function(){for(var e=[],t=0;tt.length?e.filter((function(e){return!t.find((function(t){return e===t}))})):t.filter((function(t){return!e.find((function(e){return t===e}))}))},f=function(e){if(!Array.isArray(e))throw new Error("第一个参数必须是数组");return 1==e.length?e:n(new Set(e))},s=function(e,t){return new RegExp("(\\s|^)"+t+"(\\s|$)").test(e.className)},p=function(e,t){s(e,t)||(e.className+=" "+t)},d=function(e,t){if(s(e,t)){var n=new RegExp("(\\s|^)"+t+"(\\s|$)");e.className=e.className.replace(n," ")}},m=function(e){for(var t=document.cookie.replace(/\s/g,"").split(";"),n=0;nMath.abs(r)?S(y()+r):(S(y()+o),r>0&&y()>=t||r<0&&y()<=t||e(t,n-16))}))}}},M=function(e,t){var n=window.innerHeight;e="function"==typeof e?e:function(){},t="function"==typeof t?t:function(){},window.addEventListener("resize",(function(){var r=window.innerHeight;r===n&&e(),r2&&void 0!==arguments[2]&&arguments[2],o=null;return function(){for(var a=arguments.length,i=new Array(a),u=0;u1&&void 0!==arguments[1]?arguments[1]:new WeakMap;if(t.constructor===Date)return new Date(t);if(t.constructor===RegExp)return new RegExp(t);if(n.has(t))return n.get(t);var r=Object.getOwnPropertyDescriptors(t),o=Object.create(Object.getPrototypeOf(t),r);n.set(t,o);var i,u=a(Reflect.ownKeys(t));try{for(u.s();!(i=u.n()).done;){var c=i.value;o[c]=Y(t[c])&&"function"!=typeof t[c]?e(t[c],n):t[c]}}catch(e){u.e(e)}finally{u.f()}return o},N=function(e){var t=new FormData;return Object.keys(e).forEach((function(n){var r=e[n];Array.isArray(r)?r.forEach((function(e,r){return t.append(n+"[".concat(r,"]"),e)})):t.append(n,e[n])})),t},O=function(e){return!(!e||"object"!==t(e)||Array.isArray(e))&&!Object.keys(e).length},T=function(e){if(!(e instanceof Object))throw new Error("请传入对象");var t={};for(var n in e)t[n]=e[n];return t},j=function(){return"#"+("00000"+(16777216*Math.random()<<0).toString(16)).slice(-6)},U=function(e,t){return e=Math.ceil(e),t=Math.floor(t),Math.floor(Math.random()*(t-e+1))+e},$=function(e){return/^(#([0-9a-fA-F]{3}){1,2}|[rR][gG][Bb](\((\s*(2[0-4]\d|25[0-5]|[01]?\d{1,2})\s*,){2}\s*(2[0-4]\d|25[0-5]|[01]?\d{1,2})\s*\)|[Aa]\((\s*(2[0-4]\d|25[0-5]|[01]?\d{1,2})\s*,){3}\s*([01]|0\.\d+)\s*\)))$/.test(e)},L=function(e){return/\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/.test(e)},q=function(e){return/^(^[1-9]\d{7}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}$)|(^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])((\d{4})|\d{3}[Xx])$)$/.test(e)},P=function(e){return/^(\+?0?86\-?)?1[3456789]\d{9}$/.test(e)},z=function(e){return/[-a-zA-Z0-9@:%._\+~#=]{2,256}\.[a-z]{2,6}\b([-a-zA-Z0-9@:%_\+.~#?&//=]*)/i.test(e)},H=function(){var e=parent.document;e.webkitCancelFullScreen?e.webkitCancelFullScreen():e.mozCancelFullScreen?e.mozCancelFullScreen():e.cancelFullScreen?e.cancelFullScreen():e.msExitFullscreen?e.msExitFullscreen():e.exitFullscreen?e.exitFullscreen():alert("切换失败,可尝试Esc退出")},K=function(){var e=document.body;e.webkitRequestFullScreen?e.webkitRequestFullScreen():e.mozRequestFullScreen?e.mozRequestFullScreen():e.msRequestFullscreen?e.msRequestFullscreen():e.requestFullScreen?e.requestFullScreen():alert("浏览器不支持全屏")},B=function(e){var t=window.localStorage.getItem(e);try{return JSON.parse(t)}catch(e){return t}},G=function(e){return window.localStorage.removeItem(e)},J=function(e,n){"object"===t(n)&&(n=JSON.stringify(n)),window.localStorage.setItem(e,n)},V=function(e){var t=["角","分"],n=["零","壹","贰","叁","肆","伍","陆","柒","捌","玖"],r=[["元","万","亿"],["","拾","佰","仟"]],o=e<0?"欠":"";e=Math.abs(e);for(var a="",i=0;i0;u++){for(var c="",l=0;l0;l++)c=n[e%10]+r[1][l]+c,e=Math.floor(e/10);a=c.replace(/(零.)*零$/,"").replace(/^$/,"零")+r[0][i]+a}return o+a.replace(/(零.)*零元/,"元").replace(/(零.)+/g,"零").replace(/^整$/,"零元整")},W=function(e,t){var n=document.createElement("a");if(n){if(document.body.appendChild(n),n.style.display="none",n.download=e,n.href=t,n.createEvent){var r=document.createEvent("MouseEvents");r.initEvent("click",!0,!1),r.dispatchEvent(r)}else document.createEventObject?n.fireEvent("onclick"):"function"==typeof n.onclick&&n.onclick();document.body.removeChild(n)}},X=function(){return!![].map&&0==document.createElement("canvas").toDataURL("image/webp").indexOf("data:image/webp")},Z=function(e){if(-1===(e=e||window.location.href).indexOf("?"))return{};var t="?"===e[0]?e.substr(1):e.substring(e.lastIndexOf("?")+1);if(""===t)return{};t=t.split("&");for(var n={},r=0;r=0&&(o=Math.floor(r/1e3/3600/24),a=Math.floor(r/1e3/60/60%24),i=Math.floor(r/1e3/60%60),u=Math.floor(r/1e3%60)),{d:o,h:a,m:i,s:u}}},ue=function(e,t){for(var n=[],r=[],o=new Date(e),a=new Date(t),i=o.getTime()-864e5,u=a.getTime()-864e5,c=i;c<=u;)c+=864e5,n.push(parseInt(c));for(var l in n){var f=new Date(n[l]),s=f.getFullYear(f),p=String(f.getMonth()+1).padStart(2,"0"),d=String(f.getDate()).padStart(2,"0"),m="".concat(s,"-").concat(p,"-").concat(d);r.push(m)}return r},ce=function(e,t){if(""===e||null==e||""===t||null==t)return null;var n=Date.parse(e),r=Date.parse(t);return n==r?0:(r-n)/864e5};export{p as addClass,Q as dateFormater,ee as dateStrFormat,A as debounce,k as deepClone,V as digitUppercase,W as downloadFile,e as equalityArray,H as exitFullscreen,te as formatPassTime,ne as formatRemainTime,m as getCookie,v as getExplore,N as getFormData,x as getKeyName,w as getOS,y as getScrollTop,B as getStorage,s as hasClass,$ as isColor,L as isEmail,O as isEmptyObject,q as isIdCard,re as isLeapYear,P as isPhoneNum,oe as isSameDay,X as isSupportWebP,z as isUrl,c as mergeArrayDelRepeat,ae as monthDays,b as offset,Z as parseQueryString,j as randomColor,U as randomNumber,d as removeClass,h as removeCookie,G as removeStorage,D as scrollTo,g as setCookie,S as setScrollTop,J as setStorage,T as shallowClone,I as standardAmount,R as standardIntegerAmount,_ as stringifyQueryString,l as subArray,E as throttle,ie as timeLeft,K as toFullScreen,ue as twoDateBetweenAllDay,ce as twoDaysBetweenNum,f as uniqueArray,M as windowResize}; 2 | //# sourceMappingURL=realize-utils.esm.js.map 3 | -------------------------------------------------------------------------------- /lib/realize-utils.cjs.js: -------------------------------------------------------------------------------- 1 | "use strict";Object.defineProperty(exports,"__esModule",{value:!0});function e(t){return e="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},e(t)}function t(e){return function(e){if(Array.isArray(e))return n(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||r(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function r(e,t){if(e){if("string"==typeof e)return n(e,t);var r=Object.prototype.toString.call(e).slice(8,-1);return"Object"===r&&e.constructor&&(r=e.constructor.name),"Map"===r||"Set"===r?Array.from(e):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?n(e,t):void 0}}function n(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=new Array(t);r=e.length?{done:!0}:{done:!1,value:e[o++]}},e:function(e){throw e},f:a}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var i,u=!0,c=!1;return{s:function(){n=n.call(e)},n:function(){var e=n.next();return u=e.done,e},e:function(e){c=!0,i=e},f:function(){try{u||null==n.return||n.return()}finally{if(c)throw i}}}}var a,i,u=function(e,t){return new RegExp("(\\s|^)"+t+"(\\s|$)").test(e.className)},c=function(e,t,r){var n=new Date;n.setDate(n.getDate()+r),document.cookie=e+"="+t+";expires="+n.toUTCString()},s=function(){return document.documentElement&&document.documentElement.scrollTop||document.body.scrollTop},l=function(e){return window.scrollTo(0,e),e},f=window.requestAnimationFrame||window.webkitRequestAnimationFrame||function(e){window.setTimeout(e,1e3/60)},p={8:"Backspace",9:"Tab",13:"Enter",16:"Shift",17:"Ctrl",18:"Alt",19:"Pause",20:"Caps Lock",27:"Escape",32:"Space",33:"Page Up",34:"Page Down",35:"End",36:"Home",37:"Left",38:"Up",39:"Right",40:"Down",42:"Print Screen",45:"Insert",46:"Delete",48:"0",49:"1",50:"2",51:"3",52:"4",53:"5",54:"6",55:"7",56:"8",57:"9",65:"A",66:"B",67:"C",68:"D",69:"E",70:"F",71:"G",72:"H",73:"I",74:"J",75:"K",76:"L",77:"M",78:"N",79:"O",80:"P",81:"Q",82:"R",83:"S",84:"T",85:"U",86:"V",87:"W",88:"X",89:"Y",90:"Z",91:"Windows",93:"Right Click",96:"Numpad 0",97:"Numpad 1",98:"Numpad 2",99:"Numpad 3",100:"Numpad 4",101:"Numpad 5",102:"Numpad 6",103:"Numpad 7",104:"Numpad 8",105:"Numpad 9",106:"Numpad *",107:"Numpad +",109:"Numpad -",110:"Numpad .",111:"Numpad /",112:"F1",113:"F2",114:"F3",115:"F4",116:"F5",117:"F6",118:"F7",119:"F8",120:"F9",121:"F10",122:"F11",123:"F12",144:"Num Lock",145:"Scroll Lock",182:"My Computer",183:"My Calculator",186:";",187:"=",188:",",189:"-",190:".",191:"/",192:"`",219:"[",220:"\\",221:"]",222:"'"},d=function(t){return("object"===e(t)||"function"==typeof t)&&null!==t};exports.addClass=function(e,t){u(e,t)||(e.className+=" "+t)},exports.dateFormater=function(e,t){var r=t?new Date(t):new Date,n=r.getFullYear()+"",o=r.getMonth()+1,a=r.getDate(),i=r.getHours(),u=r.getMinutes(),c=r.getSeconds();return e.replace(/YYYY|yyyy/g,n).replace(/YY|yy/g,n.substring(2,4)).replace(/MM/g,(o<10?"0":"")+o).replace(/DD/g,(a<10?"0":"")+a).replace(/HH|hh/g,(i<10?"0":"")+i).replace(/mm/g,(u<10?"0":"")+u).replace(/ss/g,(c<10?"0":"")+c)},exports.dateStrFormat=function(e,t,r){e+="";var n,o,a="";return~(a=t.indexOf("YYYY"))?(a=e.substring(a,a+4),r=r.replace(/YYYY|yyyy/g,a)):~(a=t.indexOf("YY"))&&(a=e.substring(a,a+2),r=r.replace(/YY|yy/g,a)),["M","D","H","h","m","s"].forEach((function(a){o=t.indexOf(a+a),n=~o?e.substring(o,o+2):"",r=r.replace(a+a,n)})),r},exports.debounce=function(e,t,r){return function(){var n=this,o=arguments;if(a&&clearTimeout(a),r){var u=!a;a=setTimeout((function(){a=null}),t),u&&(i=e.apply(n,o))}else a=setTimeout((function(){e.apply(n,o)}),t);return i}()},exports.deepClone=function e(t){var r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:new WeakMap;if(t.constructor===Date)return new Date(t);if(t.constructor===RegExp)return new RegExp(t);if(r.has(t))return r.get(t);var n=Object.getOwnPropertyDescriptors(t),a=Object.create(Object.getPrototypeOf(t),n);r.set(t,a);var i,u=o(Reflect.ownKeys(t));try{for(u.s();!(i=u.n()).done;){var c=i.value;a[c]=d(t[c])&&"function"!=typeof t[c]?e(t[c],r):t[c]}}catch(e){u.e(e)}finally{u.f()}return a},exports.digitUppercase=function(e){var t=["角","分"],r=["零","壹","贰","叁","肆","伍","陆","柒","捌","玖"],n=[["元","万","亿"],["","拾","佰","仟"]],o=e<0?"欠":"";e=Math.abs(e);for(var a="",i=0;i0;u++){for(var c="",s=0;s0;s++)c=r[e%10]+n[1][s]+c,e=Math.floor(e/10);a=c.replace(/(零.)*零$/,"").replace(/^$/,"零")+n[0][i]+a}return o+a.replace(/(零.)*零元/,"元").replace(/(零.)+/g,"零").replace(/^整$/,"零元整")},exports.downloadFile=function(e,t){var r=document.createElement("a");if(r){if(document.body.appendChild(r),r.style.display="none",r.download=e,r.href=t,r.createEvent){var n=document.createEvent("MouseEvents");n.initEvent("click",!0,!1),n.dispatchEvent(n)}else document.createEventObject?r.fireEvent("onclick"):"function"==typeof r.onclick&&r.onclick();document.body.removeChild(r)}},exports.equalityArray=function(e,t){if(e===t)return!0;if(e.length!==t.length)return!1;for(var r=0;rMath.abs(n)?l(s()+n):(l(s()+o),n>0&&s()>=t||n<0&&s()<=t||e(t,r-16))}))}}},exports.setCookie=c,exports.setScrollTop=l,exports.setStorage=function(t,r){"object"===e(r)&&(r=JSON.stringify(r)),window.localStorage.setItem(t,r)},exports.shallowClone=function(e){if(!(e instanceof Object))throw new Error("请传入对象");var t={};for(var r in e)t[r]=e[r];return t},exports.standardAmount=function(e){return e?parseFloat(e).toLocaleString():0===e?"0":"--"},exports.standardIntegerAmount=function(e){return e?e.toString().replace(/(\d)(?=(?:\d{3})+$)/g,"$1,"):0===e?"0":"--"},exports.stringifyQueryString=function(e){if(!e)return"";var t=[];for(var r in e){var n=e[r];if(n instanceof Array)for(var o=0;ot.length?e.filter((function(e){return!t.find((function(t){return e===t}))})):t.filter((function(t){return!e.find((function(e){return t===e}))}))},exports.throttle=function(e,t){var r=this,n=arguments.length>2&&void 0!==arguments[2]&&arguments[2],o=null;return function(){for(var a=arguments.length,i=new Array(a),u=0;u=0&&(o=Math.floor(n/1e3/3600/24),a=Math.floor(n/1e3/60/60%24),i=Math.floor(n/1e3/60%60),u=Math.floor(n/1e3%60)),{d:o,h:a,m:i,s:u}}},exports.toFullScreen=function(){var e=document.body;e.webkitRequestFullScreen?e.webkitRequestFullScreen():e.mozRequestFullScreen?e.mozRequestFullScreen():e.msRequestFullscreen?e.msRequestFullscreen():e.requestFullScreen?e.requestFullScreen():alert("浏览器不支持全屏")},exports.twoDateBetweenAllDay=function(e,t){for(var r=[],n=[],o=new Date(e),a=new Date(t),i=o.getTime()-864e5,u=a.getTime()-864e5,c=i;c<=u;)c+=864e5,r.push(parseInt(c));for(var s in r){var l=new Date(r[s]),f=l.getFullYear(l),p=String(l.getMonth()+1).padStart(2,"0"),d=String(l.getDate()).padStart(2,"0"),m="".concat(f,"-").concat(p,"-").concat(d);n.push(m)}return n},exports.twoDaysBetweenNum=function(e,t){if(""===e||null==e||""===t||null==t)return null;var r=Date.parse(e),n=Date.parse(t);return r==n?0:(n-r)/864e5},exports.uniqueArray=function(e){if(!Array.isArray(e))throw new Error("第一个参数必须是数组");return 1==e.length?e:t(new Set(e))},exports.windowResize=function(e,t){var r=window.innerHeight;e="function"==typeof e?e:function(){},t="function"==typeof t?t:function(){},window.addEventListener("resize",(function(){var n=window.innerHeight;n===r&&e(),n Math.abs(diff)) {\n setScrollTop(getScrollTop() + diff);\n return;\n }\n setScrollTop(getScrollTop() + step);\n if (\n (diff > 0 && getScrollTop() >= to) ||\n (diff < 0 && getScrollTop() <= to)\n ) {\n return;\n }\n scrollTo(to, duration - 16);\n });\n};\n","var keyCodeMap = {\n 8: 'Backspace',\n 9: 'Tab',\n 13: 'Enter',\n 16: 'Shift',\n 17: 'Ctrl',\n 18: 'Alt',\n 19: 'Pause',\n 20: 'Caps Lock',\n 27: 'Escape',\n 32: 'Space',\n 33: 'Page Up',\n 34: 'Page Down',\n 35: 'End',\n 36: 'Home',\n 37: 'Left',\n 38: 'Up',\n 39: 'Right',\n 40: 'Down',\n 42: 'Print Screen',\n 45: 'Insert',\n 46: 'Delete',\n\n 48: '0',\n 49: '1',\n 50: '2',\n 51: '3',\n 52: '4',\n 53: '5',\n 54: '6',\n 55: '7',\n 56: '8',\n 57: '9',\n\n 65: 'A',\n 66: 'B',\n 67: 'C',\n 68: 'D',\n 69: 'E',\n 70: 'F',\n 71: 'G',\n 72: 'H',\n 73: 'I',\n 74: 'J',\n 75: 'K',\n 76: 'L',\n 77: 'M',\n 78: 'N',\n 79: 'O',\n 80: 'P',\n 81: 'Q',\n 82: 'R',\n 83: 'S',\n 84: 'T',\n 85: 'U',\n 86: 'V',\n 87: 'W',\n 88: 'X',\n 89: 'Y',\n 90: 'Z',\n\n 91: 'Windows',\n 93: 'Right Click',\n\n 96: 'Numpad 0',\n 97: 'Numpad 1',\n 98: 'Numpad 2',\n 99: 'Numpad 3',\n 100: 'Numpad 4',\n 101: 'Numpad 5',\n 102: 'Numpad 6',\n 103: 'Numpad 7',\n 104: 'Numpad 8',\n 105: 'Numpad 9',\n 106: 'Numpad *',\n 107: 'Numpad +',\n 109: 'Numpad -',\n 110: 'Numpad .',\n 111: 'Numpad /',\n\n 112: 'F1',\n 113: 'F2',\n 114: 'F3',\n 115: 'F4',\n 116: 'F5',\n 117: 'F6',\n 118: 'F7',\n 119: 'F8',\n 120: 'F9',\n 121: 'F10',\n 122: 'F11',\n 123: 'F12',\n\n 144: 'Num Lock',\n 145: 'Scroll Lock',\n 182: 'My Computer',\n 183: 'My Calculator',\n 186: ';',\n 187: '=',\n 188: ',',\n 189: '-',\n 190: '.',\n 191: '/',\n 192: '`',\n 219: '[',\n 220: '\\\\',\n 221: ']',\n 222: \"'\",\n};\n/**\n * @desc 根据keycode获得键名\n * @param {Number} keycode\n * @return {String}\n */\nexport let getKeyName = function getKeyName(keycode) {\n if (keyCodeMap[keycode]) {\n return keyCodeMap[keycode];\n } else {\n console.log('Unknow Key(Key Code:' + keycode + ')');\n return '';\n }\n};\n","const isComplexDataType = (obj) =>\n (typeof obj === 'object' || typeof obj === 'function') && obj !== null;\n\n/**\n * 深拷贝, 支持各种复杂类型\n * @date 2022-02-25\n * @param {any} obj\n * @param {any} hash=newWeakMap()\n * @returns {any} 拷贝后的对象\n */\n\n/*\n 1、 不可枚举的属性 及 Symbol 类型。 可以使用 Reflect.ownKeys 方法;\n 2、 判断参数是 Date、 RegExp 类型, 则直接生成一个新的实例返回;\n 3、 利用 Object.getOwnPropertyDescriptors() 获得对象的所有属性 以及 对应 的特性, 结合 Object.create() 创建一个新的对象, 并继承传入原对象的原型链;\n 4、 利用 WeakMap 类型作为 Hash 表, 因为 WeakMap 是弱引用类型, 可以 防止内存泄漏, 作为检测循环引用很有帮组, 如果循环引用则返回 WeakMap 存储的值。\n*/\nexport let deepClone = function deepClone(obj, hash = new WeakMap()) {\n if (obj.constructor === Date) return new Date(obj); // 日期对象直接返回一个新的日期对象\n if (obj.constructor === RegExp) return new RegExp(obj); // 正则对象直接返回一个新的正则对象\n if (hash.has(obj)) return hash.get(obj); // 如果循环引用了就用 WeakMap 来解决\n let allDesc = Object.getOwnPropertyDescriptors(obj); // 获得对象的所有属性及对应的特性\n let cloneObj = Object.create(Object.getPrototypeOf(obj), allDesc); // 创建一个新的对象,并继承传入原对象的原型链\n hash.set(obj, cloneObj); // 继承原型链\n for (let key of Reflect.ownKeys(obj)) {\n // 不可枚举的属性及Symbol类型,用Reflect.ownKeys()\n cloneObj[key] =\n isComplexDataType(obj[key]) && typeof obj[key] !== 'function'\n ? deepClone(obj[key], hash)\n : obj[key];\n }\n return cloneObj;\n};\n","/*\n * @Author: wenreq 294491328@qq.com\n * @Date: 2022-11-09 21:17:24\n * @LastEditors: wenreq 294491328@qq.com\n * @LastEditTime: 2022-11-11 21:24:02\n * @FilePath: /realize-utils/src/class/addClass.js\n * @Description:\n *\n * Copyright (c) 2022 by wenreq 294491328@qq.com, All Rights Reserved.\n */\nimport { hasClass } from './hasClass';\n\n/**\n * 为元素添加class\n * @date 2022-02-22\n * @param {HTMLElement} ele\n * @param {String} cls\n */\nexport let addClass = function addClass(ele, cls) {\n if (!hasClass(ele, cls)) {\n ele.className += ' ' + cls;\n }\n};\n","/**\n * 格式化时间\n * @date 2022-08-07\n * @param {String} formater 格式化格式 'YYYY-MM-DD HH:mm:ss' 'YYYY-MM-DD' 'YYYYMMDDHHmm'\n * @param {Date | String} t 可以不传,不传默认 new Date()。\n * @returns {String} 格式化后的日期字符串\n * @example dateFormater('YYYY-MM-DD', '2020.11.29') => '2020-11-29'\n */\nexport let dateFormater = function dateFormater(formater, t) {\n let date = t ? new Date(t) : new Date(),\n Y = date.getFullYear() + '',\n M = date.getMonth() + 1,\n D = date.getDate(),\n H = date.getHours(),\n m = date.getMinutes(),\n s = date.getSeconds();\n return formater\n .replace(/YYYY|yyyy/g, Y)\n .replace(/YY|yy/g, Y.substring(2, 4))\n .replace(/MM/g, (M < 10 ? '0' : '') + M)\n .replace(/DD/g, (D < 10 ? '0' : '') + D)\n .replace(/HH|hh/g, (H < 10 ? '0' : '') + H)\n .replace(/mm/g, (m < 10 ? '0' : '') + m)\n .replace(/ss/g, (s < 10 ? '0' : '') + s);\n};\n","/**\n * 将指定字符串由一种时间格式转化为另一种。from 的格式应对应 str 的位置\n * @date 2022-08-07\n * @param {String} str 原始的日期字符串\n * @param {String} from 匹配原始字符串的格式\n * @param {String} to 想要转换的日期字符串格式\n * @returns {String} 格式化后的日期字符串\n * @example\n * dateStrForma('20220807', 'YYYYMMDD', 'YYYY年MM月DD日') ==> 2022年08月07日\n * dateStrForma('121220220807', '----YYYYMMDD', 'YYYY年MM月DD日') ==> 2022年08月07日\n * dateStrForma('2022年08月07日', 'YYYY年MM月DD日', 'YYYYMMDD') ==> 20220807\n *\n * 一般的也可以使用正则来实现\n * '2022年08月07日'.replace(/(\\d{4})年(\\d{2})月(\\d{2})日/, '$1-$2-$3') ==> 2022-08-07\n */\nexport let dateStrFormat = function dateStrFormat(str, from, to) {\n //'20220807' 'YYYYMMDD' 'YYYY年MM月DD日'\n str += '';\n let Y = '';\n if (~(Y = from.indexOf('YYYY'))) {\n Y = str.substring(Y, Y + 4);\n to = to.replace(/YYYY|yyyy/g, Y);\n } else if (~(Y = from.indexOf('YY'))) {\n Y = str.substring(Y, Y + 2);\n to = to.replace(/YY|yy/g, Y);\n }\n\n let k, i;\n ['M', 'D', 'H', 'h', 'm', 's'].forEach((s) => {\n i = from.indexOf(s + s);\n k = ~i ? str.substring(i, i + 2) : '';\n to = to.replace(s + s, k);\n });\n return to;\n};\n","/*\n * @Author: wenreq 294491328@qq.com\n * @Date: 2022-11-10 23:22:07\n * @LastEditors: wenreq 294491328@qq.com\n * @LastEditTime: 2022-11-12 00:06:51\n * @FilePath: /realize-utils/src/string/digitUppercase.js\n * @Description:\n *\n * Copyright (c) 2022 by wenreq 294491328@qq.com, All Rights Reserved.\n */\n/**\n * 现金额转大写\n * @date 2022-02-27\n * @param {Number} n\n * @returns {String}\n */\nexport let digitUppercase = function digitUppercase(n) {\n var fraction = ['角', '分'];\n var digit = ['零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖'];\n var unit = [\n ['元', '万', '亿'],\n ['', '拾', '佰', '仟'],\n ];\n var head = n < 0 ? '欠' : '';\n n = Math.abs(n);\n var s = '';\n for (var i = 0; i < fraction.length; i++) {\n s += (\n digit[Math.floor(n * 10 * Math.pow(10, i)) % 10] + fraction[i]\n ).replace(/零./, '');\n }\n s = s || '整';\n n = Math.floor(n);\n for (var l = 0; l < unit[0].length && n > 0; l++) {\n var p = '';\n for (var j = 0; j < unit[1].length && n > 0; j++) {\n p = digit[n % 10] + unit[1][j] + p;\n n = Math.floor(n / 10);\n }\n s = p.replace(/(零.)*零$/, '').replace(/^$/, '零') + unit[0][i] + s;\n }\n return (\n head +\n s\n .replace(/(零.)*零元/, '元')\n .replace(/(零.)+/g, '零')\n .replace(/^整$/, '零元整')\n );\n};\n","/**\n * 描述: base64数据导出文件,文件下载\n * @date 2022-08-16\n * @param {String} filename 文件名\n * @param {base64} data Base64 数据\n */\nexport let downloadFile = function downloadFile(filename, data) {\n let downloadLink = document.createElement('a');\n if (downloadLink) {\n document.body.appendChild(downloadLink);\n downloadLink.style.display = 'none';\n downloadLink.download = filename;\n downloadLink.href = data;\n if (downloadLink.createEvent) {\n let downloadEvt = document.createEvent('MouseEvents');\n downloadEvt.initEvent('click', true, false);\n downloadEvt.dispatchEvent(downloadEvt);\n } else if (document.createEventObject) {\n downloadLink.fireEvent('onclick');\n } else if (typeof downloadLink.onclick == 'function') {\n downloadLink.onclick();\n }\n document.body.removeChild(downloadLink);\n }\n};\n","/*\n * @Author: wenreq 294491328@qq.com\n * @Date: 2022-11-09 21:17:24\n * @LastEditors: wenreq 294491328@qq.com\n * @LastEditTime: 2022-11-10 22:57:46\n * @FilePath: /realize-utils/src/array/equalityArray.js\n * @Description:\n *\n * Copyright (c) 2022 by wenreq 294491328@qq.com, All Rights Reserved.\n */\n/**\n * 判断两个数组是否相等\n * @date 2022-02-18\n * @param {Array} array1 第一个需要对比的数组\n * @param {Array} array2 第二个需要对比的数组\n * @returns {Boolean}\n */\nexport let equalityArray = function equalityArray(array1, array2) {\n // 直接判读,两个不相等,则不相等。\n if (array1 === array2) {\n return true;\n }\n // 判断length,不相等,则不相等。\n if (array1.length !== array2.length) {\n return false;\n }\n // 循环判断各项,如有一项不相等,则不相等。\n for (let i = 0; i < array1.length; i++) {\n if (array1[i] !== array2[i]) {\n return false;\n }\n }\n // 否则,则是相等的。\n return true;\n};\n","/**\n * 退出全屏\n * @date 2022-08-16\n */\nexport let exitFullscreen = function exitFullscreen() {\n let elem = parent.document;\n elem.webkitCancelFullScreen\n ? elem.webkitCancelFullScreen()\n : elem.mozCancelFullScreen\n ? elem.mozCancelFullScreen()\n : elem.cancelFullScreen\n ? elem.cancelFullScreen()\n : elem.msExitFullscreen\n ? elem.msExitFullscreen()\n : elem.exitFullscreen\n ? elem.exitFullscreen()\n : alert('切换失败,可尝试Esc退出');\n};\n","/**\n * 格式化${startTime}距现在的已过时间\n * @param {Date} startTime '2020-11-29'\n * @return {String} '1天前' '1年前'\n */\nexport let formatPassTime = function formatPassTime(startTime) {\n var currentTime = Date.parse(new Date()),\n time = currentTime - Date.parse(new Date(startTime)),\n day = parseInt(time / (1000 * 60 * 60 * 24)),\n hour = parseInt(time / (1000 * 60 * 60)),\n min = parseInt(time / (1000 * 60)),\n month = parseInt(day / 30),\n year = parseInt(month / 12);\n if (year) return year + '年前';\n if (month) return month + '个月前';\n if (day) return day + '天前';\n if (hour) return hour + '小时前';\n if (min) return min + '分钟前';\n else return '刚刚';\n};\n","/**\n * 计算从一个时间到现在过去多久\n * @date 2022-02-24\n * @param {String} 字符串日期 '2020-11-29'\n * @returns {String} '451天15小时17分钟25秒'\n */\nexport let formatRemainTime = function formatRemainTime(time) {\n const nowStamp = new Date().getTime();\n const targetStamp = new Date(time.replace(/-/g, '/')).getTime();\n const difference = nowStamp - targetStamp;\n const allSeconds = Math.floor(difference / 1000);\n const allMinutes = Math.floor(allSeconds / 60);\n const allHours = Math.floor(allMinutes / 60);\n const day = Math.floor(allHours / 24);\n const hours = allHours % 24;\n const minutes = allMinutes % 60;\n const seconds = allSeconds % 60;\n return `${day}天${hours}小时${minutes}分钟${seconds}秒`;\n};\n","/*\n * @Author: wenreq 294491328@qq.com\n * @Date: 2022-11-09 21:17:24\n * @LastEditors: wenreq 294491328@qq.com\n * @LastEditTime: 2022-11-10 22:54:19\n * @FilePath: /realize-utils/src/cookie/getCookie.js\n * @Description:\n *\n * Copyright (c) 2022 by wenreq 294491328@qq.com, All Rights Reserved.\n */\n/**\n * 根据 name 读取 cookie\n * @date 2022-02-18\n * @param {String} name\n * @returns {String}\n */\nexport let getCookie = function getCookie(name) {\n let cookieArr = document.cookie.replace(/\\s/g, '').split(';');\n for (let i = 0; i < cookieArr.length; i++) {\n const eleArr = cookieArr[i].split('=');\n if (eleArr[0] === name) {\n return decodeURIComponent(eleArr[1]);\n }\n }\n return '';\n};\n","/*\n * @Author: wenreq 294491328@qq.com\n * @Date: 2022-11-09 21:17:24\n * @LastEditors: wenreq 294491328@qq.com\n * @LastEditTime: 2022-11-11 23:49:16\n * @FilePath: /realize-utils/src/device/getExplore.js\n * @Description:\n *\n * Copyright (c) 2022 by wenreq 294491328@qq.com, All Rights Reserved.\n */\n/**\n * 获取浏览器类型和版本\n * @date 2022-02-23\n * @returns {String} '类型:版本'\n */\nexport let getExplore = function getExplore() {\n var sys = {},\n ua = navigator.userAgent.toLowerCase(),\n s;\n // IE - rv:11.0) like Gecko\n (s = ua.match(/rv:([\\d.]+)\\) like gecko/))\n ? (sys.ie = s[1])\n : (s = ua.match(/msie ([\\d\\.]+)/))\n ? (sys.ie = s[1])\n : (s = ua.match(/edge\\/([\\d\\.]+)/))\n ? (sys.edge = s[1])\n : (s = ua.match(/firefox\\/([\\d\\.]+)/))\n ? (sys.firefox = s[1])\n : (s = ua.match(/(?:opera|opr).([\\d\\.]+)/))\n ? (sys.opera = s[1])\n : (s = ua.match(/chrome\\/([\\d\\.]+)/))\n ? (sys.chrome = s[1])\n : (s = ua.match(/version\\/([\\d\\.]+).*safari/))\n ? (sys.safari = s[1])\n : 0;\n\n // 根据关系进行判断\n if (sys.ie) return 'IE:' + sys.ie;\n if (sys.edge) return 'EDGE: ' + sys.edge;\n if (sys.firefox) return 'Firefox: ' + sys.firefox;\n if (sys.chrome) return 'Chrome: ' + sys.chrome;\n if (sys.opera) return 'Opera: ' + sys.opera;\n if (sys.safari) return 'Safari: ' + sys.safari;\n return 'unknown';\n};\n","/**\n * 将对象转换为 formData 对象\n * @date 2022-02-25\n * @param {Object} object 需要转换的对象\n * @returns {Object} formData 对象\n */\nexport let getFormData = function getFormData(object) {\n let formData = new FormData();\n Object.keys(object).forEach((key) => {\n let value = object[key];\n if (Array.isArray(value)) {\n value.forEach((subValue, i) => formData.append(key + `[${i}]`, subValue));\n } else {\n formData.append(key, object[key]);\n }\n });\n return formData;\n};\n","/*\n * @Author: wenreq 294491328@qq.com\n * @Date: 2022-11-09 21:17:24\n * @LastEditors: wenreq 294491328@qq.com\n * @LastEditTime: 2022-11-10 22:52:12\n * @FilePath: /realize-utils/src/device/getOS.js\n * @Description:\n *\n * Copyright (c) 2022 by wenreq 294491328@qq.com, All Rights Reserved.\n */\n/**\n * 获取操作系统类型\n * @date 2022-02-23\n * @returns {String} 操作系统类型\n */\nexport let getOS = function getOS() {\n var userAgent =\n ('navigator' in window &&\n 'userAgent' in navigator &&\n navigator.userAgent.toLowerCase()) ||\n '';\n var appVersion =\n ('navigator' in window &&\n 'appVersion' in navigator &&\n navigator.appVersion.toLowerCase()) ||\n '';\n\n if (\n /iphone/i.test(userAgent) ||\n /ipad/i.test(userAgent) ||\n /ipod/i.test(userAgent)\n )\n return 'ios';\n if (/android/i.test(userAgent)) return 'android';\n if (/win/i.test(appVersion) && /phone/i.test(userAgent))\n return 'windowsPhone';\n if (/mac/i.test(appVersion)) return 'MacOSX';\n if (/win/i.test(appVersion)) return 'windows';\n if (/linux/i.test(appVersion)) return 'linux';\n};\n","/**\n * 获取本地存储\n * @date 2022-02-17\n * @param {string} name 本地存储名称\n */\nexport let getStorage = function getStorage(name) {\n const data = window.localStorage.getItem(name);\n try {\n return JSON.parse(data);\n } catch (error) {\n return data;\n }\n};\n","/**\n * 判断是否为16进制颜色, rgb 或 rgba\n * @date 2022-02-27\n * @param {String} str\n * @returns {Boolean}\n */\nexport let isColor = function isColor(str) {\n return /^(#([0-9a-fA-F]{3}){1,2}|[rR][gG][Bb](\\((\\s*(2[0-4]\\d|25[0-5]|[01]?\\d{1,2})\\s*,){2}\\s*(2[0-4]\\d|25[0-5]|[01]?\\d{1,2})\\s*\\)|[Aa]\\((\\s*(2[0-4]\\d|25[0-5]|[01]?\\d{1,2})\\s*,){3}\\s*([01]|0\\.\\d+)\\s*\\)))$/.test(\n str\n );\n};\n","/**\n * 判断是否为邮箱地址\n * @date 2022-02-27\n * @param {String} str\n * @returns {Boolean}\n */\nexport let isEmail = function isEmail(str) {\n return /\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*/.test(str);\n};\n","/**\n * 判断 obj 是否为空\n * @date 2022-02-25\n * @param {Object} obj\n * @returns {Boolean}\n */\nexport let isEmptyObject = function isEmptyObject(obj) {\n if (!obj || typeof obj !== 'object' || Array.isArray(obj)) return false;\n return !Object.keys(obj).length;\n};\n","/**\n * 判断是否为身份证号\n * @date 2022-02-27\n * @param {String|Number} str\n * @returns {Boolean}\n */\nexport let isIdCard = function isIdCard(str) {\n return /^(^[1-9]\\d{7}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d{3}$)|(^[1-9]\\d{5}[1-9]\\d{3}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])((\\d{4})|\\d{3}[Xx])$)$/.test(\n str\n );\n};\n","/**\n * 是否为闰年\n * @date 2022-02-27\n * @param {Number} year\n * @returns {Boolean}\n */\nexport let isLeapYear = function isLeapYear(year) {\n if (0 === year % 4 && (year % 100 !== 0 || year % 400 === 0)) {\n return true;\n }\n return false;\n};\n","/*\n * @Author: wenreq 294491328@qq.com\n * @Date: 2022-11-10 23:22:07\n * @LastEditors: wenreq 294491328@qq.com\n * @LastEditTime: 2022-11-12 00:06:11\n * @FilePath: /realize-utils/src/regexp/isPhoneNum.js\n * @Description:\n *\n * Copyright (c) 2022 by wenreq 294491328@qq.com, All Rights Reserved.\n */\n/**\n * 判断是否为手机号\n * @date 2022-02-27\n * @param {String|Number} str\n * @returns {Boolean}\n */\nexport let isPhoneNum = function isPhoneNum(str) {\n return /^(\\+?0?86\\-?)?1[3456789]\\d{9}$/.test(str);\n};\n","/**\n * 判断是否为同一天\n * @date 2022-02-27\n * @param {Date} date1\n * @param {Date} date2 可选 / 默认值:当天\n * @returns {Boolean}\n */\nexport let isSameDay = function isSameDay(date1, date2) {\n if (!date2) {\n date2 = new Date();\n }\n var date1_year = date1.getFullYear(),\n date1_month = date1.getMonth() + 1,\n date1_date = date1.getDate();\n var date2_year = date2.getFullYear(),\n date2_month = date2.getMonth() + 1,\n date2_date = date2.getDate();\n return (\n date1_date === date2_date &&\n date1_month === date2_month &&\n date1_year === date2_year\n );\n};\n","/**\n * 判断浏览器是否支持webP格式图片\n * @date 2022-02-27\n * @returns {Boolean}\n */\nexport let isSupportWebP = function isSupportWebP() {\n return (\n !![].map &&\n document\n .createElement('canvas')\n .toDataURL('image/webp')\n .indexOf('data:image/webp') == 0\n );\n};\n","/**\n * 描述\n * @date 判断是否为URL地址\n * @param {String} str\n * @returns {Boolean}\n */\nexport let isUrl = function isUrl(str) {\n return /[-a-zA-Z0-9@:%._\\+~#=]{2,256}\\.[a-z]{2,6}\\b([-a-zA-Z0-9@:%_\\+.~#?&//=]*)/i.test(\n str\n );\n};\n","/**\n * 获取指定日期月份的总天数\n * @date 2022-02-27\n * @param {Date} time\n * @returns {Number}\n */\nexport let monthDays = function monthDays(time) {\n time = new Date(time);\n var year = time.getFullYear();\n var month = time.getMonth() + 1;\n return new Date(year, month, 0).getDate();\n};\n","/*\n * @Author: wenreq 294491328@qq.com\n * @Date: 2022-11-09 21:17:24\n * @LastEditors: wenreq 294491328@qq.com\n * @LastEditTime: 2022-11-10 22:50:14\n * @FilePath: /realize-utils/src/dom/offset.js\n * @Description:\n *\n * Copyright (c) 2022 by wenreq 294491328@qq.com, All Rights Reserved.\n */\n/**\n * 获取一个元素距离文档(document)的位置,类似于JQ中的offset()\n * @date 2022-02-24\n * @param {HTMLElement} ele 元素\n * @returns { {left: number, top: number} } 距离文档左侧、顶部的距离\n */\nexport let offset = function offset(ele) {\n var pos = {\n left: 0,\n top: 0,\n };\n while (ele) {\n pos.left += ele.offsetLeft;\n pos.top += ele.offsetTop;\n ele += ele.offsetParent;\n }\n return pos;\n};\n","/*\n * @Author: wenreq 294491328@qq.com\n * @Date: 2022-11-09 21:17:24\n * @LastEditors: wenreq 294491328@qq.com\n * @LastEditTime: 2022-11-09 22:23:02\n * @FilePath: /realize-utils/src/url/parseQueryString.js\n * @Description: esm\n *\n * Copyright (c) 2022 by wenreq 294491328@qq.com, All Rights Reserved.\n */\n/**\n * url参数转对象\n * @date 2022-02-27\n * @param {String} url default: window.location.href\n * @returns {Object}\n */\nexport let parseQueryString = function parseQueryString(url) {\n url = !url ? window.location.href : url;\n if (url.indexOf('?') === -1) {\n return {};\n }\n var search =\n url[0] === '?' ? url.substr(1) : url.substring(url.lastIndexOf('?') + 1);\n if (search === '') {\n return {};\n }\n search = search.split('&');\n var query = {};\n for (let i = 0; i < search.length; i++) {\n var pair = search[i].split('=');\n query[decodeURIComponent(pair[0])] = decodeURIComponent(pair[1] || '');\n }\n return query;\n};\n","/**\n * 描述 随机生成颜色\n * @date 2022-02-27\n * @returns {String}\n */\nexport let randomColor = function randomColor() {\n return (\n '#' + ('00000' + ((Math.random() * 0x1000000) << 0).toString(16)).slice(-6)\n );\n};\n","/**\n * 生成指定范围[min, max] 的随机数\n * @date 2022-02-27\n * @param {Number} min\n * @param {Number} max\n * @returns {Number}\n */\nexport let randomNumber = function randomNumber(min, max) {\n min = Math.ceil(min);\n max = Math.floor(max);\n return Math.floor(Math.random() * (max - min + 1)) + min;\n};\n","/*\n * @Author: wenreq 294491328@qq.com\n * @Date: 2022-11-09 21:17:24\n * @LastEditors: wenreq 294491328@qq.com\n * @LastEditTime: 2022-11-11 21:24:05\n * @FilePath: /realize-utils/src/class/removeClass.js\n * @Description:\n *\n * Copyright (c) 2022 by wenreq 294491328@qq.com, All Rights Reserved.\n */\nimport { hasClass } from './hasClass';\n\n/**\n * 为元素移除某个class类\n * @date 2022-02-22\n * @param {HTMLElement} ele 元素\n * @param {String} cls 类名\n */\nexport let removeClass = function removeClass(ele, cls) {\n if (hasClass(ele, cls)) {\n var reg = new RegExp('(\\\\s|^)' + cls + '(\\\\s|$)');\n ele.className = ele.className.replace(reg, ' ');\n }\n};\n","/*\n * @Author: wenreq 294491328@qq.com\n * @Date: 2022-11-09 21:17:24\n * @LastEditors: wenreq 294491328@qq.com\n * @LastEditTime: 2022-11-11 21:24:08\n * @FilePath: /realize-utils/src/cookie/removeCookie.js\n * @Description:\n *\n * Copyright (c) 2022 by wenreq 294491328@qq.com, All Rights Reserved.\n */\nimport { setCookie } from './setCookie';\n\n/**\n * 根据 name 删除 cookie\n * @date 2022-02-18\n * @param {String} name cookie 的名称\n */\nexport let removeCookie = function removeCookie(name) {\n // 设置已过期,系统会立刻删除 cookie\n setCookie(name, '1', -1);\n};\n","/**\n * 删除本地存储\n * @date 2022-02-17\n * @param {string} name 本地存储名称\n * @returns {boolean} 删除成功 true,否则 false\n */\nexport let removeStorage = function removeStorage(name) {\n return window.localStorage.removeItem(name);\n};\n","/**\n * 添加本地存储\n * @date 2022-02-17\n * @param {string} name 本地存储名称\n * @param {*} data 本地存储数据\n */\nexport let setStorage = function setStorage(name, data) {\n if (typeof data === 'object') {\n data = JSON.stringify(data);\n }\n window.localStorage.setItem(name, data);\n};\n","/*\n * @Author: wenreq 294491328@qq.com\n * @Date: 2022-11-10 23:22:07\n * @LastEditors: wenreq 294491328@qq.com\n * @LastEditTime: 2022-11-11 23:53:34\n * @FilePath: /realize-utils/src/object/shallowClone.js\n * @Description:\n *\n * Copyright (c) 2022 by wenreq 294491328@qq.com, All Rights Reserved.\n */\n/**\n * 浅克隆\n * @date 2022-02-25\n * @param {Object} obj 需要拷贝的对象\n * @returns {Object} 浅拷贝之后的对象\n */\nexport let shallowClone = function shallowClone(obj) {\n if (!(obj instanceof Object)) {\n throw new Error('请传入对象');\n }\n const res = {};\n for (const key in obj) {\n res[key] = obj[key];\n }\n return res;\n};\n","/**\n * 将数字(包含小数)逢三一断\n * @date 2022-08-06\n * @param {Number} value 要转换的值\n * @returns {String} 转换后的值\n * @example standardAmount(999999999.9991) => '999,999,999.999'\n */\nexport let standardAmount = function standardAmount(value) {\n if (!value) {\n return value === 0 ? '0' : '--';\n }\n const intPartFormat = parseFloat(value).toLocaleString();\n return intPartFormat;\n};\n","/**\n * 将整数数字逢三一断\n * @date 2022-08-06\n * @param {Number} value 要转换的值\n * @returns {String} 转换后的值\n * @example standardIntegerAmount(99999999999) => '99,999,999,999'\n */\nexport let standardIntegerAmount = function standardIntegerAmount(value) {\n if (!value) {\n return value === 0 ? '0' : '--';\n }\n const intPartFormat = value.toString().replace(/(\\d)(?=(?:\\d{3})+$)/g, '$1,');\n return intPartFormat;\n};\n","/*\n * @Author: wenreq 294491328@qq.com\n * @Date: 2022-11-09 21:17:24\n * @LastEditors: wenreq 294491328@qq.com\n * @LastEditTime: 2022-11-09 22:26:06\n * @FilePath: /realize-utils/src/url/stringifyQueryString.js\n * @Description: esm\n *\n * Copyright (c) 2022 by wenreq 294491328@qq.com, All Rights Reserved.\n */\n/**\n * 对象序列化\n * @date 2022-02-27\n * @param {Object} obj\n * @returns {String}\n */\nexport let stringifyQueryString = function stringifyQueryString(obj) {\n if (!obj) return '';\n var pairs = [];\n\n for (var key in obj) {\n var value = obj[key];\n if (value instanceof Array) {\n for (var i = 0; i < value.length; ++i) {\n pairs.push(\n encodeURIComponent(key + '[' + i + ']') +\n '=' +\n encodeURIComponent(value[i])\n );\n }\n continue;\n }\n pairs.push(encodeURIComponent(key) + '=' + encodeURIComponent(obj[key]));\n }\n\n return pairs.join('&');\n};\n","/*\n * @Author: wenreq 294491328@qq.com\n * @Date: 2022-11-09 21:17:24\n * @LastEditors: wenreq 294491328@qq.com\n * @LastEditTime: 2022-11-10 22:57:07\n * @FilePath: /realize-utils/src/array/subArray.js\n * @Description:\n *\n * Copyright (c) 2022 by wenreq 294491328@qq.com, All Rights Reserved.\n */\n/**\n * 数组相减\n * 例如有两个数组\n * const arr1 = [1, 2, 3, 4, 5, 6] 和 const arr2 = [1, 2, 3]\n * 那么这时候需要第一个数组减去第二个数组中的项,返回剩下的项\n * 使用 subArray(arr1, arr2) 就可以解决这个问题\n * 返回 [4, 5, 6]\n * @date 2022-02-23\n * @param {Array} array1 要处理的数组\n * @param {Array} array2 要处理的数组\n * @returns {Array} 相减后的数组\n */\nexport let subArray = function subArray(array1, array2) {\n if (array1.length > array2.length) {\n return array1.filter((item1) => {\n return !array2.find((item2) => {\n return item1 === item2;\n });\n });\n } else {\n return array2.filter((item1) => {\n return !array1.find((item2) => {\n return item1 === item2;\n });\n });\n }\n};\n","/**\n * 节流\n * flag 开始为 true 则进入函数之后会执行计时器, 在一秒之后会执行\n * 继续向下之后flag被变为false, 那么在此进入函数之后将不再执行计时器\n * 在计时器执行完成之后, 将 flag变为true 之后才可以继续执行\n * 节流起到了可控制高频事件逻辑执行的次数\n * @date 2022-02-24\n * @param {Function} fn 延迟毫秒后执行的函数。\n * @param {Number} wait 延迟的毫秒数\n * @param {Boolean} immediate 为true时,fn在可以执行时立即执行,否则必须延时wait后才能执行\n */\nexport let throttle = function throttle(fn, wait, immediate = false) {\n let timeout = null;\n return (...args) => {\n if (!timeout) {\n immediate && fn.apply(this, args);\n timeout = setTimeout(() => {\n !immediate && fn.apply(this, args);\n timeout = null;\n }, wait);\n }\n };\n};\n","/**\n * ${startTime - endTime}的剩余时间,startTime大于endTime时,均返回0\n * @param { Date | String } startTime\n * @param { Date | String } endTime\n * @returns { Object } { d, h, m, s } 天 时 分 秒\n */\nexport let timeLeft = function timeLeft(startTime, endTime) {\n if (!startTime || !endTime) {\n return;\n }\n var startDate, endDate;\n if (startTime instanceof Date) {\n startDate = startTime;\n } else {\n startDate = new Date(startTime.replace(/-/g, '/')); //开始时间\n }\n if (endTime instanceof Date) {\n endDate = endTime;\n } else {\n endDate = new Date(endTime.replace(/-/g, '/')); //结束时间\n }\n var t = endDate.getTime() - startDate.getTime();\n var d = 0,\n h = 0,\n m = 0,\n s = 0;\n if (t >= 0) {\n d = Math.floor(t / 1000 / 3600 / 24);\n h = Math.floor((t / 1000 / 60 / 60) % 24);\n m = Math.floor((t / 1000 / 60) % 60);\n s = Math.floor((t / 1000) % 60);\n }\n return {\n d,\n h,\n m,\n s,\n };\n};\n","/**\n * 描述: 全屏\n * @date 2022-08-16\n */\nexport let toFullScreen = function toFullScreen() {\n let elem = document.body;\n elem.webkitRequestFullScreen\n ? elem.webkitRequestFullScreen()\n : elem.mozRequestFullScreen\n ? elem.mozRequestFullScreen()\n : elem.msRequestFullscreen\n ? elem.msRequestFullscreen()\n : elem.requestFullScreen\n ? elem.requestFullScreen()\n : alert('浏览器不支持全屏');\n};\n","/**\n * 根据指定的两个日期,计算并返回中间的所有日期。\n * @date 2022-06-09\n * @param {String} startDay 开始日期 '2022-06-01'\n * @param {String} endDay 结束日期 '2022-06-09'\n * @returns {Array} 包含所有日期的集合 ['2022-06-01', '2022-06-02', '2022-06-03', '2022-06-04', '2022-06-05', '2022-06-06', '2022-06-07', '2022-06-08', '2022-06-09']\n */\nexport let twoDateBetweenAllDay = function twoDateBetweenAllDay(\n startDay,\n endDay\n) {\n let arr = [];\n let dates = [];\n // 设置两个日期 UTC 时间\n const sd = new Date(startDay);\n const ed = new Date(endDay);\n // 获取两个日期 GTM 时间\n const s = sd.getTime() - 24 * 60 * 60 * 1000;\n const e = ed.getTime() - 24 * 60 * 60 * 1000;\n // 获取到两个日期之间的每一天的毫秒数\n for (let i = s; i <= e; ) {\n i = i + 24 * 60 * 60 * 1000;\n arr.push(parseInt(i));\n }\n // 获取每一天的时间 YY-MM-DD\n for (const j in arr) {\n const time = new Date(arr[j]);\n const year = time.getFullYear(time);\n const month = String(time.getMonth() + 1).padStart(2, '0');\n const day = String(time.getDate()).padStart(2, '0');\n const YYMMDD = `${year}-${month}-${day}`;\n dates.push(YYMMDD);\n }\n return dates;\n};\n","/**\n * 两个日期之间的天数\n * @date 2022-06-16\n * @param {Date} startDay 开始日期 '2022-06-16'\n * @param {Date} endDay 结束日期 '2022-06-20'\n * @returns {Number} 两个日期之间的天数 4\n */\nexport let twoDaysBetweenNum = (startDay, endDay) => {\n if (\n startDay === '' ||\n startDay === null ||\n startDay === undefined ||\n endDay === '' ||\n endDay === null ||\n endDay === undefined\n ) {\n return null;\n }\n const startDate = Date.parse(startDay);\n const endDate = Date.parse(endDay);\n if (startDate == endDate) {\n return 0;\n }\n const days = (endDate - startDate) / (1 * 24 * 60 * 60 * 1000);\n return days;\n};\n","/*\n * @Author: wenreq 294491328@qq.com\n * @Date: 2022-11-09 21:17:24\n * @LastEditors: wenreq 294491328@qq.com\n * @LastEditTime: 2022-11-10 22:56:45\n * @FilePath: /realize-utils/src/array/uniqueArray.js\n * @Description:\n *\n * Copyright (c) 2022 by wenreq 294491328@qq.com, All Rights Reserved.\n */\n/**\n * 数组去除重复项\n * @date 2022-02-18\n * @param {Array} array 需要去重的数组\n * @returns {Array} 去重之后的数组,如果传入的不是数组则返回空数组。\n */\nexport let uniqueArray = function uniqueArray(array) {\n if (!Array.isArray(array)) {\n throw new Error('第一个参数必须是数组');\n }\n if (array.length == 1) {\n return array;\n }\n return [...new Set(array)];\n};\n","/*\n * @Author: wenreq 294491328@qq.com\n * @Date: 2022-11-09 21:17:24\n * @LastEditors: wenreq 294491328@qq.com\n * @LastEditTime: 2022-11-10 22:48:45\n * @FilePath: /realize-utils/src/dom/windowResize.js\n * @Description:\n *\n * Copyright (c) 2022 by wenreq 294491328@qq.com, All Rights Reserved.\n */\n/**\n * H5软键盘缩回、弹起回调\n * 当软件键盘弹起会改变当前 window.innerHeight, 监听这个值变化\n * @date 2022-02-24\n * @param {Function} downCb 当软键盘弹起后,缩回的回调\n * @param {any} upCb 当软键盘弹起的回调\n */\nexport let windowResize = function windowResize(downCb, upCb) {\n var clientHeight = window.innerHeight;\n downCb = typeof downCb === 'function' ? downCb : function () {};\n upCb = typeof upCb === 'function' ? upCb : function () {};\n window.addEventListener('resize', () => {\n var height = window.innerHeight;\n if (height === clientHeight) {\n downCb();\n }\n if (height < clientHeight) {\n upCb();\n }\n });\n};\n"],"names":["mergeArrayDelRepeat","timeout","result","hasClass","ele","cls","RegExp","test","className","setCookie","name","value","days","date","Date","setDate","getDate","document","cookie","toUTCString","getScrollTop","documentElement","scrollTop","body","setScrollTop","window","scrollTo","requestAnimFrame","requestAnimationFrame","webkitRequestAnimationFrame","callback","setTimeout","keyCodeMap","isComplexDataType","obj","_typeof","formater","t","Y","getFullYear","M","getMonth","D","H","getHours","m","getMinutes","s","getSeconds","replace","substring","str","from","to","k","i","indexOf","forEach","func","wait","immediate","context","this","args","arguments","clearTimeout","callNow","apply","debounced","deepClone","hash","length","undefined","WeakMap","constructor","has","get","allDesc","Object","getOwnPropertyDescriptors","cloneObj","create","getPrototypeOf","set","_step","_iterator","_createForOfIteratorHelper","Reflect","ownKeys","n","done","key","err","e","f","fraction","digit","unit","head","Math","abs","floor","pow","l","p","j","filename","data","downloadLink","createElement","appendChild","style","display","download","href","createEvent","downloadEvt","initEvent","dispatchEvent","createEventObject","fireEvent","onclick","removeChild","array1","array2","elem","parent","webkitCancelFullScreen","mozCancelFullScreen","cancelFullScreen","msExitFullscreen","exitFullscreen","alert","startTime","time","parse","day","parseInt","hour","min","month","year","difference","getTime","allSeconds","allMinutes","allHours","hours","minutes","seconds","concat","cookieArr","split","eleArr","decodeURIComponent","sys","ua","navigator","userAgent","toLowerCase","match","ie","edge","firefox","opera","chrome","safari","object","formData","FormData","keys","Array","isArray","subValue","append","keycode","console","log","appVersion","localStorage","getItem","JSON","error","date1","date2","date1_year","date1_month","date1_date","date2_year","date2_month","map","toDataURL","newArr","push","_toConsumableArray","Set","pos","left","top","offsetLeft","offsetTop","offsetParent","url","location","search","substr","lastIndexOf","query","pair","random","toString","slice","max","ceil","reg","removeItem","duration","diff","step","stringify","setItem","Error","res","parseFloat","toLocaleString","pairs","encodeURIComponent","join","filter","item1","find","item2","fn","_this","_len","_key","endTime","startDate","d","h","webkitRequestFullScreen","mozRequestFullScreen","msRequestFullscreen","requestFullScreen","startDay","endDay","arr","dates","sd","ed","String","padStart","YYMMDD","endDate","array","downCb","upCb","clientHeight","innerHeight","addEventListener","height"],"mappings":"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"} -------------------------------------------------------------------------------- /lib/realize-utils.cjs.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"realize-utils.cjs.js","sources":["../src/array/mergeArrayDelRepeat.js","../src/function/debounce.js","../src/class/hasClass.js","../src/cookie/setCookie.js","../src/dom/getScrollTop.js","../src/dom/setScrollTop.js","../src/dom/scrollTo.js","../src/keycode/getKeyName.js","../src/object/deepClone.js","../src/class/addClass.js","../src/time/dateFormater.js","../src/time/dateStrFormat.js","../src/string/digitUppercase.js","../src/support/downloadFile.js","../src/array/equalityArray.js","../src/screen/exitFullscreen.js","../src/time/formatPassTime.js","../src/time/formatRemainTime.js","../src/cookie/getCookie.js","../src/device/getExplore.js","../src/object/getFormData.js","../src/device/getOS.js","../src/storage/getStorage.js","../src/regexp/isColor.js","../src/regexp/isEmail.js","../src/object/isEmptyObject.js","../src/regexp/isIdCard.js","../src/time/isLeapYear.js","../src/regexp/isPhoneNum.js","../src/time/isSameDay.js","../src/support/isSupportWebP.js","../src/regexp/isUrl.js","../src/time/monthDays.js","../src/dom/offset.js","../src/url/parseQueryString.js","../src/random/randomColor.js","../src/random/randomNumber.js","../src/class/removeClass.js","../src/cookie/removeCookie.js","../src/storage/removeStorage.js","../src/storage/setStorage.js","../src/object/shallowClone.js","../src/number/standardAmount.js","../src/number/standardIntegerAmount.js","../src/url/stringifyQueryString.js","../src/array/subArray.js","../src/function/throttle.js","../src/time/timeLeft.js","../src/screen/toFullScreen.js","../src/time/twoDateBetweenAllDay.js","../src/time/twoDaysBetweenNum.js","../src/array/uniqueArray.js","../src/dom/windowResize.js"],"sourcesContent":["/*\n * @Author: wenreq 294491328@qq.com\n * @Date: 2022-11-09 21:17:24\n * @LastEditors: wenreq 294491328@qq.com\n * @LastEditTime: 2022-11-10 22:57:28\n * @FilePath: /realize-utils/src/array/mergeArrayDelRepeat.js\n * @Description:\n *\n * Copyright (c) 2022 by wenreq 294491328@qq.com, All Rights Reserved.\n */\n/**\n * 将多个数组合并为一个新的数组,并去重。\n * 该方法可以传一个或多个数组\n * @date 2022-02-18\n * @returns {Array} 将多个数组合并后并去重后的新数组\n */\nexport let mergeArrayDelRepeat = function mergeArrayDelRepeat() {\n let newArr = [];\n for (let i = 0; i < arguments.length; i++) {\n newArr.push(...arguments[i]);\n }\n return [...new Set([...newArr])];\n};\n","/**\n * 防抖: 保证一个函数在多少毫秒内不再被触发,只会执行一次。\n * @date 2022-02-24\n * @param {Function} func 逻辑函数\n * @param {Number} wait 执行逻辑的间隔(毫秒)\n * @param {Boolean} immediate 是否立即执行\n */\n\n// timeout接收setTimeout返回的唯一值,result接收最终返回值\n// 定时器的声明不能放在函数内部,否则将会持续新建函数,造成多次执行问题\nlet timeout, result;\n\nexport let debounce = function debounce(func, wait, immediate) {\n let debounced = function () {\n let context = this; //将this用context接收\n let args = arguments; //将arguments用args接收\n\n if (timeout) clearTimeout(timeout); //如果有timeout在执行,清除它\n if (immediate) {\n let callNow = !timeout; // 是否需要绑定this指向,和arguments\n timeout = setTimeout(function () {\n // 设置一个\n timeout = null;\n }, wait);\n if (callNow) result = func.apply(context, args);\n } else {\n // 如果不用立即执行的话\n timeout = setTimeout(function () {\n func.apply(context, args);\n }, wait);\n }\n return result;\n };\n\n return debounced();\n};\n","/*\n * @Author: wenreq 294491328@qq.com\n * @Date: 2022-11-09 21:17:24\n * @LastEditors: wenreq 294491328@qq.com\n * @LastEditTime: 2022-11-10 22:55:41\n * @FilePath: /realize-utils/src/class/hasClass.js\n * @Description:\n *\n * Copyright (c) 2022 by wenreq 294491328@qq.com, All Rights Reserved.\n */\n/**\n * 判断元素是否有某个class\n * @date 2022-02-22\n * @param {HTMLElement} ele\n * @param {String} cls\n * @returns {Boolean} 包含返回true,否则返回false\n */\nexport let hasClass = function hasClass(ele, cls) {\n return new RegExp('(\\\\s|^)' + cls + '(\\\\s|$)').test(ele.className);\n};\n","/*\n * @Author: wenreq 294491328@qq.com\n * @Date: 2022-11-09 21:17:24\n * @LastEditors: wenreq 294491328@qq.com\n * @LastEditTime: 2022-11-10 22:52:57\n * @FilePath: /realize-utils/src/cookie/setCookie.js\n * @Description:\n *\n * Copyright (c) 2022 by wenreq 294491328@qq.com, All Rights Reserved.\n */\n/**\n * 设置 cookie\n * @date 2022-02-18\n * @param {String} name cookie 名称\n * @param {String} value cookie 的值\n * @param {Number} days cookie 的有限天数\n */\nexport let setCookie = function setCookie(name, value, days) {\n var date = new Date();\n date.setDate(date.getDate() + days);\n document.cookie = name + '=' + value + ';expires=' + date.toUTCString();\n};\n","/*\n * @Author: wenreq 294491328@qq.com\n * @Date: 2022-11-09 21:17:24\n * @LastEditors: wenreq 294491328@qq.com\n * @LastEditTime: 2022-11-10 22:51:14\n * @FilePath: /realize-utils/src/dom/getScrollTop.js\n * @Description:\n *\n * Copyright (c) 2022 by wenreq 294491328@qq.com, All Rights Reserved.\n */\n/**\n * 获取滚动条距顶部的距离\n * @date 2022-02-24\n * @returns {Number}\n */\nexport let getScrollTop = function getScrollTop() {\n return (\n (document.documentElement && document.documentElement.scrollTop) ||\n document.body.scrollTop\n );\n};\n","/*\n * @Author: wenreq 294491328@qq.com\n * @Date: 2022-11-09 21:17:24\n * @LastEditors: wenreq 294491328@qq.com\n * @LastEditTime: 2022-11-10 22:49:20\n * @FilePath: /realize-utils/src/dom/setScrollTop.js\n * @Description:\n *\n * Copyright (c) 2022 by wenreq 294491328@qq.com, All Rights Reserved.\n */\n/**\n * 设置滚动条距顶部的距离\n * @date 2022-02-24\n * @param {Number} value 距顶部的距离的值\n */\nexport let setScrollTop = function setScrollTop(value) {\n window.scrollTo(0, value);\n return value;\n};\n","/*\n * @Author: wenreq 294491328@qq.com\n * @Date: 2022-11-09 21:17:24\n * @LastEditors: wenreq 294491328@qq.com\n * @LastEditTime: 2022-11-11 21:25:36\n * @FilePath: /realize-utils/src/dom/scrollTo.js\n * @Description:\n *\n * Copyright (c) 2022 by wenreq 294491328@qq.com, All Rights Reserved.\n */\nimport { getScrollTop } from './getScrollTop';\nimport { setScrollTop } from './setScrollTop';\nvar requestAnimFrame = (function () {\n // window.requestAnimationFrame 要求浏览器在下次重绘之前调用指定的回调函数更新动画。\n return (\n window.requestAnimationFrame ||\n window.webkitRequestAnimationFrame ||\n function (callback) {\n window.setTimeout(callback, 1000 / 60);\n }\n );\n})();\n\n/**\n * 在 duration 时间内,滚动条平滑滚动到 to 指定位置\n * @date 2022-02-24\n * @param {Number} to 滚动位置的值\n * @param {Number} duration 时间-毫秒数\n */\nexport let scrollTo = function scrollTo(to, duration) {\n if (duration < 0) {\n setScrollTop(to);\n return;\n }\n var diff = to - getScrollTop();\n if (diff === 0) return;\n var step = (diff / duration) * 10;\n requestAnimFrame(function () {\n if (Math.abs(step) > Math.abs(diff)) {\n setScrollTop(getScrollTop() + diff);\n return;\n }\n setScrollTop(getScrollTop() + step);\n if (\n (diff > 0 && getScrollTop() >= to) ||\n (diff < 0 && getScrollTop() <= to)\n ) {\n return;\n }\n scrollTo(to, duration - 16);\n });\n};\n","var keyCodeMap = {\n 8: 'Backspace',\n 9: 'Tab',\n 13: 'Enter',\n 16: 'Shift',\n 17: 'Ctrl',\n 18: 'Alt',\n 19: 'Pause',\n 20: 'Caps Lock',\n 27: 'Escape',\n 32: 'Space',\n 33: 'Page Up',\n 34: 'Page Down',\n 35: 'End',\n 36: 'Home',\n 37: 'Left',\n 38: 'Up',\n 39: 'Right',\n 40: 'Down',\n 42: 'Print Screen',\n 45: 'Insert',\n 46: 'Delete',\n\n 48: '0',\n 49: '1',\n 50: '2',\n 51: '3',\n 52: '4',\n 53: '5',\n 54: '6',\n 55: '7',\n 56: '8',\n 57: '9',\n\n 65: 'A',\n 66: 'B',\n 67: 'C',\n 68: 'D',\n 69: 'E',\n 70: 'F',\n 71: 'G',\n 72: 'H',\n 73: 'I',\n 74: 'J',\n 75: 'K',\n 76: 'L',\n 77: 'M',\n 78: 'N',\n 79: 'O',\n 80: 'P',\n 81: 'Q',\n 82: 'R',\n 83: 'S',\n 84: 'T',\n 85: 'U',\n 86: 'V',\n 87: 'W',\n 88: 'X',\n 89: 'Y',\n 90: 'Z',\n\n 91: 'Windows',\n 93: 'Right Click',\n\n 96: 'Numpad 0',\n 97: 'Numpad 1',\n 98: 'Numpad 2',\n 99: 'Numpad 3',\n 100: 'Numpad 4',\n 101: 'Numpad 5',\n 102: 'Numpad 6',\n 103: 'Numpad 7',\n 104: 'Numpad 8',\n 105: 'Numpad 9',\n 106: 'Numpad *',\n 107: 'Numpad +',\n 109: 'Numpad -',\n 110: 'Numpad .',\n 111: 'Numpad /',\n\n 112: 'F1',\n 113: 'F2',\n 114: 'F3',\n 115: 'F4',\n 116: 'F5',\n 117: 'F6',\n 118: 'F7',\n 119: 'F8',\n 120: 'F9',\n 121: 'F10',\n 122: 'F11',\n 123: 'F12',\n\n 144: 'Num Lock',\n 145: 'Scroll Lock',\n 182: 'My Computer',\n 183: 'My Calculator',\n 186: ';',\n 187: '=',\n 188: ',',\n 189: '-',\n 190: '.',\n 191: '/',\n 192: '`',\n 219: '[',\n 220: '\\\\',\n 221: ']',\n 222: \"'\",\n};\n/**\n * @desc 根据keycode获得键名\n * @param {Number} keycode\n * @return {String}\n */\nexport let getKeyName = function getKeyName(keycode) {\n if (keyCodeMap[keycode]) {\n return keyCodeMap[keycode];\n } else {\n console.log('Unknow Key(Key Code:' + keycode + ')');\n return '';\n }\n};\n","const isComplexDataType = (obj) =>\n (typeof obj === 'object' || typeof obj === 'function') && obj !== null;\n\n/**\n * 深拷贝, 支持各种复杂类型\n * @date 2022-02-25\n * @param {any} obj\n * @param {any} hash=newWeakMap()\n * @returns {any} 拷贝后的对象\n */\n\n/*\n 1、 不可枚举的属性 及 Symbol 类型。 可以使用 Reflect.ownKeys 方法;\n 2、 判断参数是 Date、 RegExp 类型, 则直接生成一个新的实例返回;\n 3、 利用 Object.getOwnPropertyDescriptors() 获得对象的所有属性 以及 对应 的特性, 结合 Object.create() 创建一个新的对象, 并继承传入原对象的原型链;\n 4、 利用 WeakMap 类型作为 Hash 表, 因为 WeakMap 是弱引用类型, 可以 防止内存泄漏, 作为检测循环引用很有帮组, 如果循环引用则返回 WeakMap 存储的值。\n*/\nexport let deepClone = function deepClone(obj, hash = new WeakMap()) {\n if (obj.constructor === Date) return new Date(obj); // 日期对象直接返回一个新的日期对象\n if (obj.constructor === RegExp) return new RegExp(obj); // 正则对象直接返回一个新的正则对象\n if (hash.has(obj)) return hash.get(obj); // 如果循环引用了就用 WeakMap 来解决\n let allDesc = Object.getOwnPropertyDescriptors(obj); // 获得对象的所有属性及对应的特性\n let cloneObj = Object.create(Object.getPrototypeOf(obj), allDesc); // 创建一个新的对象,并继承传入原对象的原型链\n hash.set(obj, cloneObj); // 继承原型链\n for (let key of Reflect.ownKeys(obj)) {\n // 不可枚举的属性及Symbol类型,用Reflect.ownKeys()\n cloneObj[key] =\n isComplexDataType(obj[key]) && typeof obj[key] !== 'function'\n ? deepClone(obj[key], hash)\n : obj[key];\n }\n return cloneObj;\n};\n","/*\n * @Author: wenreq 294491328@qq.com\n * @Date: 2022-11-09 21:17:24\n * @LastEditors: wenreq 294491328@qq.com\n * @LastEditTime: 2022-11-11 21:24:02\n * @FilePath: /realize-utils/src/class/addClass.js\n * @Description:\n *\n * Copyright (c) 2022 by wenreq 294491328@qq.com, All Rights Reserved.\n */\nimport { hasClass } from './hasClass';\n\n/**\n * 为元素添加class\n * @date 2022-02-22\n * @param {HTMLElement} ele\n * @param {String} cls\n */\nexport let addClass = function addClass(ele, cls) {\n if (!hasClass(ele, cls)) {\n ele.className += ' ' + cls;\n }\n};\n","/**\n * 格式化时间\n * @date 2022-08-07\n * @param {String} formater 格式化格式 'YYYY-MM-DD HH:mm:ss' 'YYYY-MM-DD' 'YYYYMMDDHHmm'\n * @param {Date | String} t 可以不传,不传默认 new Date()。\n * @returns {String} 格式化后的日期字符串\n * @example dateFormater('YYYY-MM-DD', '2020.11.29') => '2020-11-29'\n */\nexport let dateFormater = function dateFormater(formater, t) {\n let date = t ? new Date(t) : new Date(),\n Y = date.getFullYear() + '',\n M = date.getMonth() + 1,\n D = date.getDate(),\n H = date.getHours(),\n m = date.getMinutes(),\n s = date.getSeconds();\n return formater\n .replace(/YYYY|yyyy/g, Y)\n .replace(/YY|yy/g, Y.substring(2, 4))\n .replace(/MM/g, (M < 10 ? '0' : '') + M)\n .replace(/DD/g, (D < 10 ? '0' : '') + D)\n .replace(/HH|hh/g, (H < 10 ? '0' : '') + H)\n .replace(/mm/g, (m < 10 ? '0' : '') + m)\n .replace(/ss/g, (s < 10 ? '0' : '') + s);\n};\n","/**\n * 将指定字符串由一种时间格式转化为另一种。from 的格式应对应 str 的位置\n * @date 2022-08-07\n * @param {String} str 原始的日期字符串\n * @param {String} from 匹配原始字符串的格式\n * @param {String} to 想要转换的日期字符串格式\n * @returns {String} 格式化后的日期字符串\n * @example\n * dateStrForma('20220807', 'YYYYMMDD', 'YYYY年MM月DD日') ==> 2022年08月07日\n * dateStrForma('121220220807', '----YYYYMMDD', 'YYYY年MM月DD日') ==> 2022年08月07日\n * dateStrForma('2022年08月07日', 'YYYY年MM月DD日', 'YYYYMMDD') ==> 20220807\n *\n * 一般的也可以使用正则来实现\n * '2022年08月07日'.replace(/(\\d{4})年(\\d{2})月(\\d{2})日/, '$1-$2-$3') ==> 2022-08-07\n */\nexport let dateStrFormat = function dateStrFormat(str, from, to) {\n //'20220807' 'YYYYMMDD' 'YYYY年MM月DD日'\n str += '';\n let Y = '';\n if (~(Y = from.indexOf('YYYY'))) {\n Y = str.substring(Y, Y + 4);\n to = to.replace(/YYYY|yyyy/g, Y);\n } else if (~(Y = from.indexOf('YY'))) {\n Y = str.substring(Y, Y + 2);\n to = to.replace(/YY|yy/g, Y);\n }\n\n let k, i;\n ['M', 'D', 'H', 'h', 'm', 's'].forEach((s) => {\n i = from.indexOf(s + s);\n k = ~i ? str.substring(i, i + 2) : '';\n to = to.replace(s + s, k);\n });\n return to;\n};\n","/*\n * @Author: wenreq 294491328@qq.com\n * @Date: 2022-11-10 23:22:07\n * @LastEditors: wenreq 294491328@qq.com\n * @LastEditTime: 2022-11-12 00:06:51\n * @FilePath: /realize-utils/src/string/digitUppercase.js\n * @Description:\n *\n * Copyright (c) 2022 by wenreq 294491328@qq.com, All Rights Reserved.\n */\n/**\n * 现金额转大写\n * @date 2022-02-27\n * @param {Number} n\n * @returns {String}\n */\nexport let digitUppercase = function digitUppercase(n) {\n var fraction = ['角', '分'];\n var digit = ['零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖'];\n var unit = [\n ['元', '万', '亿'],\n ['', '拾', '佰', '仟'],\n ];\n var head = n < 0 ? '欠' : '';\n n = Math.abs(n);\n var s = '';\n for (var i = 0; i < fraction.length; i++) {\n s += (\n digit[Math.floor(n * 10 * Math.pow(10, i)) % 10] + fraction[i]\n ).replace(/零./, '');\n }\n s = s || '整';\n n = Math.floor(n);\n for (var l = 0; l < unit[0].length && n > 0; l++) {\n var p = '';\n for (var j = 0; j < unit[1].length && n > 0; j++) {\n p = digit[n % 10] + unit[1][j] + p;\n n = Math.floor(n / 10);\n }\n s = p.replace(/(零.)*零$/, '').replace(/^$/, '零') + unit[0][i] + s;\n }\n return (\n head +\n s\n .replace(/(零.)*零元/, '元')\n .replace(/(零.)+/g, '零')\n .replace(/^整$/, '零元整')\n );\n};\n","/**\n * 描述: base64数据导出文件,文件下载\n * @date 2022-08-16\n * @param {String} filename 文件名\n * @param {base64} data Base64 数据\n */\nexport let downloadFile = function downloadFile(filename, data) {\n let downloadLink = document.createElement('a');\n if (downloadLink) {\n document.body.appendChild(downloadLink);\n downloadLink.style.display = 'none';\n downloadLink.download = filename;\n downloadLink.href = data;\n if (downloadLink.createEvent) {\n let downloadEvt = document.createEvent('MouseEvents');\n downloadEvt.initEvent('click', true, false);\n downloadEvt.dispatchEvent(downloadEvt);\n } else if (document.createEventObject) {\n downloadLink.fireEvent('onclick');\n } else if (typeof downloadLink.onclick == 'function') {\n downloadLink.onclick();\n }\n document.body.removeChild(downloadLink);\n }\n};\n","/*\n * @Author: wenreq 294491328@qq.com\n * @Date: 2022-11-09 21:17:24\n * @LastEditors: wenreq 294491328@qq.com\n * @LastEditTime: 2022-11-10 22:57:46\n * @FilePath: /realize-utils/src/array/equalityArray.js\n * @Description:\n *\n * Copyright (c) 2022 by wenreq 294491328@qq.com, All Rights Reserved.\n */\n/**\n * 判断两个数组是否相等\n * @date 2022-02-18\n * @param {Array} array1 第一个需要对比的数组\n * @param {Array} array2 第二个需要对比的数组\n * @returns {Boolean}\n */\nexport let equalityArray = function equalityArray(array1, array2) {\n // 直接判读,两个不相等,则不相等。\n if (array1 === array2) {\n return true;\n }\n // 判断length,不相等,则不相等。\n if (array1.length !== array2.length) {\n return false;\n }\n // 循环判断各项,如有一项不相等,则不相等。\n for (let i = 0; i < array1.length; i++) {\n if (array1[i] !== array2[i]) {\n return false;\n }\n }\n // 否则,则是相等的。\n return true;\n};\n","/**\n * 退出全屏\n * @date 2022-08-16\n */\nexport let exitFullscreen = function exitFullscreen() {\n let elem = parent.document;\n elem.webkitCancelFullScreen\n ? elem.webkitCancelFullScreen()\n : elem.mozCancelFullScreen\n ? elem.mozCancelFullScreen()\n : elem.cancelFullScreen\n ? elem.cancelFullScreen()\n : elem.msExitFullscreen\n ? elem.msExitFullscreen()\n : elem.exitFullscreen\n ? elem.exitFullscreen()\n : alert('切换失败,可尝试Esc退出');\n};\n","/**\n * 格式化${startTime}距现在的已过时间\n * @param {Date} startTime '2020-11-29'\n * @return {String} '1天前' '1年前'\n */\nexport let formatPassTime = function formatPassTime(startTime) {\n var currentTime = Date.parse(new Date()),\n time = currentTime - Date.parse(new Date(startTime)),\n day = parseInt(time / (1000 * 60 * 60 * 24)),\n hour = parseInt(time / (1000 * 60 * 60)),\n min = parseInt(time / (1000 * 60)),\n month = parseInt(day / 30),\n year = parseInt(month / 12);\n if (year) return year + '年前';\n if (month) return month + '个月前';\n if (day) return day + '天前';\n if (hour) return hour + '小时前';\n if (min) return min + '分钟前';\n else return '刚刚';\n};\n","/**\n * 计算从一个时间到现在过去多久\n * @date 2022-02-24\n * @param {String} 字符串日期 '2020-11-29'\n * @returns {String} '451天15小时17分钟25秒'\n */\nexport let formatRemainTime = function formatRemainTime(time) {\n const nowStamp = new Date().getTime();\n const targetStamp = new Date(time.replace(/-/g, '/')).getTime();\n const difference = nowStamp - targetStamp;\n const allSeconds = Math.floor(difference / 1000);\n const allMinutes = Math.floor(allSeconds / 60);\n const allHours = Math.floor(allMinutes / 60);\n const day = Math.floor(allHours / 24);\n const hours = allHours % 24;\n const minutes = allMinutes % 60;\n const seconds = allSeconds % 60;\n return `${day}天${hours}小时${minutes}分钟${seconds}秒`;\n};\n","/*\n * @Author: wenreq 294491328@qq.com\n * @Date: 2022-11-09 21:17:24\n * @LastEditors: wenreq 294491328@qq.com\n * @LastEditTime: 2022-11-10 22:54:19\n * @FilePath: /realize-utils/src/cookie/getCookie.js\n * @Description:\n *\n * Copyright (c) 2022 by wenreq 294491328@qq.com, All Rights Reserved.\n */\n/**\n * 根据 name 读取 cookie\n * @date 2022-02-18\n * @param {String} name\n * @returns {String}\n */\nexport let getCookie = function getCookie(name) {\n let cookieArr = document.cookie.replace(/\\s/g, '').split(';');\n for (let i = 0; i < cookieArr.length; i++) {\n const eleArr = cookieArr[i].split('=');\n if (eleArr[0] === name) {\n return decodeURIComponent(eleArr[1]);\n }\n }\n return '';\n};\n","/*\n * @Author: wenreq 294491328@qq.com\n * @Date: 2022-11-09 21:17:24\n * @LastEditors: wenreq 294491328@qq.com\n * @LastEditTime: 2022-11-11 23:49:16\n * @FilePath: /realize-utils/src/device/getExplore.js\n * @Description:\n *\n * Copyright (c) 2022 by wenreq 294491328@qq.com, All Rights Reserved.\n */\n/**\n * 获取浏览器类型和版本\n * @date 2022-02-23\n * @returns {String} '类型:版本'\n */\nexport let getExplore = function getExplore() {\n var sys = {},\n ua = navigator.userAgent.toLowerCase(),\n s;\n // IE - rv:11.0) like Gecko\n (s = ua.match(/rv:([\\d.]+)\\) like gecko/))\n ? (sys.ie = s[1])\n : (s = ua.match(/msie ([\\d\\.]+)/))\n ? (sys.ie = s[1])\n : (s = ua.match(/edge\\/([\\d\\.]+)/))\n ? (sys.edge = s[1])\n : (s = ua.match(/firefox\\/([\\d\\.]+)/))\n ? (sys.firefox = s[1])\n : (s = ua.match(/(?:opera|opr).([\\d\\.]+)/))\n ? (sys.opera = s[1])\n : (s = ua.match(/chrome\\/([\\d\\.]+)/))\n ? (sys.chrome = s[1])\n : (s = ua.match(/version\\/([\\d\\.]+).*safari/))\n ? (sys.safari = s[1])\n : 0;\n\n // 根据关系进行判断\n if (sys.ie) return 'IE:' + sys.ie;\n if (sys.edge) return 'EDGE: ' + sys.edge;\n if (sys.firefox) return 'Firefox: ' + sys.firefox;\n if (sys.chrome) return 'Chrome: ' + sys.chrome;\n if (sys.opera) return 'Opera: ' + sys.opera;\n if (sys.safari) return 'Safari: ' + sys.safari;\n return 'unknown';\n};\n","/**\n * 将对象转换为 formData 对象\n * @date 2022-02-25\n * @param {Object} object 需要转换的对象\n * @returns {Object} formData 对象\n */\nexport let getFormData = function getFormData(object) {\n let formData = new FormData();\n Object.keys(object).forEach((key) => {\n let value = object[key];\n if (Array.isArray(value)) {\n value.forEach((subValue, i) => formData.append(key + `[${i}]`, subValue));\n } else {\n formData.append(key, object[key]);\n }\n });\n return formData;\n};\n","/*\n * @Author: wenreq 294491328@qq.com\n * @Date: 2022-11-09 21:17:24\n * @LastEditors: wenreq 294491328@qq.com\n * @LastEditTime: 2022-11-10 22:52:12\n * @FilePath: /realize-utils/src/device/getOS.js\n * @Description:\n *\n * Copyright (c) 2022 by wenreq 294491328@qq.com, All Rights Reserved.\n */\n/**\n * 获取操作系统类型\n * @date 2022-02-23\n * @returns {String} 操作系统类型\n */\nexport let getOS = function getOS() {\n var userAgent =\n ('navigator' in window &&\n 'userAgent' in navigator &&\n navigator.userAgent.toLowerCase()) ||\n '';\n var appVersion =\n ('navigator' in window &&\n 'appVersion' in navigator &&\n navigator.appVersion.toLowerCase()) ||\n '';\n\n if (\n /iphone/i.test(userAgent) ||\n /ipad/i.test(userAgent) ||\n /ipod/i.test(userAgent)\n )\n return 'ios';\n if (/android/i.test(userAgent)) return 'android';\n if (/win/i.test(appVersion) && /phone/i.test(userAgent))\n return 'windowsPhone';\n if (/mac/i.test(appVersion)) return 'MacOSX';\n if (/win/i.test(appVersion)) return 'windows';\n if (/linux/i.test(appVersion)) return 'linux';\n};\n","/**\n * 获取本地存储\n * @date 2022-02-17\n * @param {string} name 本地存储名称\n */\nexport let getStorage = function getStorage(name) {\n const data = window.localStorage.getItem(name);\n try {\n return JSON.parse(data);\n } catch (error) {\n return data;\n }\n};\n","/**\n * 判断是否为16进制颜色, rgb 或 rgba\n * @date 2022-02-27\n * @param {String} str\n * @returns {Boolean}\n */\nexport let isColor = function isColor(str) {\n return /^(#([0-9a-fA-F]{3}){1,2}|[rR][gG][Bb](\\((\\s*(2[0-4]\\d|25[0-5]|[01]?\\d{1,2})\\s*,){2}\\s*(2[0-4]\\d|25[0-5]|[01]?\\d{1,2})\\s*\\)|[Aa]\\((\\s*(2[0-4]\\d|25[0-5]|[01]?\\d{1,2})\\s*,){3}\\s*([01]|0\\.\\d+)\\s*\\)))$/.test(\n str\n );\n};\n","/**\n * 判断是否为邮箱地址\n * @date 2022-02-27\n * @param {String} str\n * @returns {Boolean}\n */\nexport let isEmail = function isEmail(str) {\n return /\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*/.test(str);\n};\n","/**\n * 判断 obj 是否为空\n * @date 2022-02-25\n * @param {Object} obj\n * @returns {Boolean}\n */\nexport let isEmptyObject = function isEmptyObject(obj) {\n if (!obj || typeof obj !== 'object' || Array.isArray(obj)) return false;\n return !Object.keys(obj).length;\n};\n","/**\n * 判断是否为身份证号\n * @date 2022-02-27\n * @param {String|Number} str\n * @returns {Boolean}\n */\nexport let isIdCard = function isIdCard(str) {\n return /^(^[1-9]\\d{7}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d{3}$)|(^[1-9]\\d{5}[1-9]\\d{3}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])((\\d{4})|\\d{3}[Xx])$)$/.test(\n str\n );\n};\n","/**\n * 是否为闰年\n * @date 2022-02-27\n * @param {Number} year\n * @returns {Boolean}\n */\nexport let isLeapYear = function isLeapYear(year) {\n if (0 === year % 4 && (year % 100 !== 0 || year % 400 === 0)) {\n return true;\n }\n return false;\n};\n","/*\n * @Author: wenreq 294491328@qq.com\n * @Date: 2022-11-10 23:22:07\n * @LastEditors: wenreq 294491328@qq.com\n * @LastEditTime: 2022-11-12 00:06:11\n * @FilePath: /realize-utils/src/regexp/isPhoneNum.js\n * @Description:\n *\n * Copyright (c) 2022 by wenreq 294491328@qq.com, All Rights Reserved.\n */\n/**\n * 判断是否为手机号\n * @date 2022-02-27\n * @param {String|Number} str\n * @returns {Boolean}\n */\nexport let isPhoneNum = function isPhoneNum(str) {\n return /^(\\+?0?86\\-?)?1[3456789]\\d{9}$/.test(str);\n};\n","/**\n * 判断是否为同一天\n * @date 2022-02-27\n * @param {Date} date1\n * @param {Date} date2 可选 / 默认值:当天\n * @returns {Boolean}\n */\nexport let isSameDay = function isSameDay(date1, date2) {\n if (!date2) {\n date2 = new Date();\n }\n var date1_year = date1.getFullYear(),\n date1_month = date1.getMonth() + 1,\n date1_date = date1.getDate();\n var date2_year = date2.getFullYear(),\n date2_month = date2.getMonth() + 1,\n date2_date = date2.getDate();\n return (\n date1_date === date2_date &&\n date1_month === date2_month &&\n date1_year === date2_year\n );\n};\n","/**\n * 判断浏览器是否支持webP格式图片\n * @date 2022-02-27\n * @returns {Boolean}\n */\nexport let isSupportWebP = function isSupportWebP() {\n return (\n !![].map &&\n document\n .createElement('canvas')\n .toDataURL('image/webp')\n .indexOf('data:image/webp') == 0\n );\n};\n","/**\n * 描述\n * @date 判断是否为URL地址\n * @param {String} str\n * @returns {Boolean}\n */\nexport let isUrl = function isUrl(str) {\n return /[-a-zA-Z0-9@:%._\\+~#=]{2,256}\\.[a-z]{2,6}\\b([-a-zA-Z0-9@:%_\\+.~#?&//=]*)/i.test(\n str\n );\n};\n","/**\n * 获取指定日期月份的总天数\n * @date 2022-02-27\n * @param {Date} time\n * @returns {Number}\n */\nexport let monthDays = function monthDays(time) {\n time = new Date(time);\n var year = time.getFullYear();\n var month = time.getMonth() + 1;\n return new Date(year, month, 0).getDate();\n};\n","/*\n * @Author: wenreq 294491328@qq.com\n * @Date: 2022-11-09 21:17:24\n * @LastEditors: wenreq 294491328@qq.com\n * @LastEditTime: 2022-11-10 22:50:14\n * @FilePath: /realize-utils/src/dom/offset.js\n * @Description:\n *\n * Copyright (c) 2022 by wenreq 294491328@qq.com, All Rights Reserved.\n */\n/**\n * 获取一个元素距离文档(document)的位置,类似于JQ中的offset()\n * @date 2022-02-24\n * @param {HTMLElement} ele 元素\n * @returns { {left: number, top: number} } 距离文档左侧、顶部的距离\n */\nexport let offset = function offset(ele) {\n var pos = {\n left: 0,\n top: 0,\n };\n while (ele) {\n pos.left += ele.offsetLeft;\n pos.top += ele.offsetTop;\n ele += ele.offsetParent;\n }\n return pos;\n};\n","/*\n * @Author: wenreq 294491328@qq.com\n * @Date: 2022-11-09 21:17:24\n * @LastEditors: wenreq 294491328@qq.com\n * @LastEditTime: 2022-11-09 22:23:02\n * @FilePath: /realize-utils/src/url/parseQueryString.js\n * @Description: esm\n *\n * Copyright (c) 2022 by wenreq 294491328@qq.com, All Rights Reserved.\n */\n/**\n * url参数转对象\n * @date 2022-02-27\n * @param {String} url default: window.location.href\n * @returns {Object}\n */\nexport let parseQueryString = function parseQueryString(url) {\n url = !url ? window.location.href : url;\n if (url.indexOf('?') === -1) {\n return {};\n }\n var search =\n url[0] === '?' ? url.substr(1) : url.substring(url.lastIndexOf('?') + 1);\n if (search === '') {\n return {};\n }\n search = search.split('&');\n var query = {};\n for (let i = 0; i < search.length; i++) {\n var pair = search[i].split('=');\n query[decodeURIComponent(pair[0])] = decodeURIComponent(pair[1] || '');\n }\n return query;\n};\n","/**\n * 描述 随机生成颜色\n * @date 2022-02-27\n * @returns {String}\n */\nexport let randomColor = function randomColor() {\n return (\n '#' + ('00000' + ((Math.random() * 0x1000000) << 0).toString(16)).slice(-6)\n );\n};\n","/**\n * 生成指定范围[min, max] 的随机数\n * @date 2022-02-27\n * @param {Number} min\n * @param {Number} max\n * @returns {Number}\n */\nexport let randomNumber = function randomNumber(min, max) {\n min = Math.ceil(min);\n max = Math.floor(max);\n return Math.floor(Math.random() * (max - min + 1)) + min;\n};\n","/*\n * @Author: wenreq 294491328@qq.com\n * @Date: 2022-11-09 21:17:24\n * @LastEditors: wenreq 294491328@qq.com\n * @LastEditTime: 2022-11-11 21:24:05\n * @FilePath: /realize-utils/src/class/removeClass.js\n * @Description:\n *\n * Copyright (c) 2022 by wenreq 294491328@qq.com, All Rights Reserved.\n */\nimport { hasClass } from './hasClass';\n\n/**\n * 为元素移除某个class类\n * @date 2022-02-22\n * @param {HTMLElement} ele 元素\n * @param {String} cls 类名\n */\nexport let removeClass = function removeClass(ele, cls) {\n if (hasClass(ele, cls)) {\n var reg = new RegExp('(\\\\s|^)' + cls + '(\\\\s|$)');\n ele.className = ele.className.replace(reg, ' ');\n }\n};\n","/*\n * @Author: wenreq 294491328@qq.com\n * @Date: 2022-11-09 21:17:24\n * @LastEditors: wenreq 294491328@qq.com\n * @LastEditTime: 2022-11-11 21:24:08\n * @FilePath: /realize-utils/src/cookie/removeCookie.js\n * @Description:\n *\n * Copyright (c) 2022 by wenreq 294491328@qq.com, All Rights Reserved.\n */\nimport { setCookie } from './setCookie';\n\n/**\n * 根据 name 删除 cookie\n * @date 2022-02-18\n * @param {String} name cookie 的名称\n */\nexport let removeCookie = function removeCookie(name) {\n // 设置已过期,系统会立刻删除 cookie\n setCookie(name, '1', -1);\n};\n","/**\n * 删除本地存储\n * @date 2022-02-17\n * @param {string} name 本地存储名称\n * @returns {boolean} 删除成功 true,否则 false\n */\nexport let removeStorage = function removeStorage(name) {\n return window.localStorage.removeItem(name);\n};\n","/**\n * 添加本地存储\n * @date 2022-02-17\n * @param {string} name 本地存储名称\n * @param {*} data 本地存储数据\n */\nexport let setStorage = function setStorage(name, data) {\n if (typeof data === 'object') {\n data = JSON.stringify(data);\n }\n window.localStorage.setItem(name, data);\n};\n","/*\n * @Author: wenreq 294491328@qq.com\n * @Date: 2022-11-10 23:22:07\n * @LastEditors: wenreq 294491328@qq.com\n * @LastEditTime: 2022-11-11 23:53:34\n * @FilePath: /realize-utils/src/object/shallowClone.js\n * @Description:\n *\n * Copyright (c) 2022 by wenreq 294491328@qq.com, All Rights Reserved.\n */\n/**\n * 浅克隆\n * @date 2022-02-25\n * @param {Object} obj 需要拷贝的对象\n * @returns {Object} 浅拷贝之后的对象\n */\nexport let shallowClone = function shallowClone(obj) {\n if (!(obj instanceof Object)) {\n throw new Error('请传入对象');\n }\n const res = {};\n for (const key in obj) {\n res[key] = obj[key];\n }\n return res;\n};\n","/**\n * 将数字(包含小数)逢三一断\n * @date 2022-08-06\n * @param {Number} value 要转换的值\n * @returns {String} 转换后的值\n * @example standardAmount(999999999.9991) => '999,999,999.999'\n */\nexport let standardAmount = function standardAmount(value) {\n if (!value) {\n return value === 0 ? '0' : '--';\n }\n const intPartFormat = parseFloat(value).toLocaleString();\n return intPartFormat;\n};\n","/**\n * 将整数数字逢三一断\n * @date 2022-08-06\n * @param {Number} value 要转换的值\n * @returns {String} 转换后的值\n * @example standardIntegerAmount(99999999999) => '99,999,999,999'\n */\nexport let standardIntegerAmount = function standardIntegerAmount(value) {\n if (!value) {\n return value === 0 ? '0' : '--';\n }\n const intPartFormat = value.toString().replace(/(\\d)(?=(?:\\d{3})+$)/g, '$1,');\n return intPartFormat;\n};\n","/*\n * @Author: wenreq 294491328@qq.com\n * @Date: 2022-11-09 21:17:24\n * @LastEditors: wenreq 294491328@qq.com\n * @LastEditTime: 2022-11-09 22:26:06\n * @FilePath: /realize-utils/src/url/stringifyQueryString.js\n * @Description: esm\n *\n * Copyright (c) 2022 by wenreq 294491328@qq.com, All Rights Reserved.\n */\n/**\n * 对象序列化\n * @date 2022-02-27\n * @param {Object} obj\n * @returns {String}\n */\nexport let stringifyQueryString = function stringifyQueryString(obj) {\n if (!obj) return '';\n var pairs = [];\n\n for (var key in obj) {\n var value = obj[key];\n if (value instanceof Array) {\n for (var i = 0; i < value.length; ++i) {\n pairs.push(\n encodeURIComponent(key + '[' + i + ']') +\n '=' +\n encodeURIComponent(value[i])\n );\n }\n continue;\n }\n pairs.push(encodeURIComponent(key) + '=' + encodeURIComponent(obj[key]));\n }\n\n return pairs.join('&');\n};\n","/*\n * @Author: wenreq 294491328@qq.com\n * @Date: 2022-11-09 21:17:24\n * @LastEditors: wenreq 294491328@qq.com\n * @LastEditTime: 2022-11-10 22:57:07\n * @FilePath: /realize-utils/src/array/subArray.js\n * @Description:\n *\n * Copyright (c) 2022 by wenreq 294491328@qq.com, All Rights Reserved.\n */\n/**\n * 数组相减\n * 例如有两个数组\n * const arr1 = [1, 2, 3, 4, 5, 6] 和 const arr2 = [1, 2, 3]\n * 那么这时候需要第一个数组减去第二个数组中的项,返回剩下的项\n * 使用 subArray(arr1, arr2) 就可以解决这个问题\n * 返回 [4, 5, 6]\n * @date 2022-02-23\n * @param {Array} array1 要处理的数组\n * @param {Array} array2 要处理的数组\n * @returns {Array} 相减后的数组\n */\nexport let subArray = function subArray(array1, array2) {\n if (array1.length > array2.length) {\n return array1.filter((item1) => {\n return !array2.find((item2) => {\n return item1 === item2;\n });\n });\n } else {\n return array2.filter((item1) => {\n return !array1.find((item2) => {\n return item1 === item2;\n });\n });\n }\n};\n","/**\n * 节流\n * flag 开始为 true 则进入函数之后会执行计时器, 在一秒之后会执行\n * 继续向下之后flag被变为false, 那么在此进入函数之后将不再执行计时器\n * 在计时器执行完成之后, 将 flag变为true 之后才可以继续执行\n * 节流起到了可控制高频事件逻辑执行的次数\n * @date 2022-02-24\n * @param {Function} fn 延迟毫秒后执行的函数。\n * @param {Number} wait 延迟的毫秒数\n * @param {Boolean} immediate 为true时,fn在可以执行时立即执行,否则必须延时wait后才能执行\n */\nexport let throttle = function throttle(fn, wait, immediate = false) {\n let timeout = null;\n return (...args) => {\n if (!timeout) {\n immediate && fn.apply(this, args);\n timeout = setTimeout(() => {\n !immediate && fn.apply(this, args);\n timeout = null;\n }, wait);\n }\n };\n};\n","/**\n * ${startTime - endTime}的剩余时间,startTime大于endTime时,均返回0\n * @param { Date | String } startTime\n * @param { Date | String } endTime\n * @returns { Object } { d, h, m, s } 天 时 分 秒\n */\nexport let timeLeft = function timeLeft(startTime, endTime) {\n if (!startTime || !endTime) {\n return;\n }\n var startDate, endDate;\n if (startTime instanceof Date) {\n startDate = startTime;\n } else {\n startDate = new Date(startTime.replace(/-/g, '/')); //开始时间\n }\n if (endTime instanceof Date) {\n endDate = endTime;\n } else {\n endDate = new Date(endTime.replace(/-/g, '/')); //结束时间\n }\n var t = endDate.getTime() - startDate.getTime();\n var d = 0,\n h = 0,\n m = 0,\n s = 0;\n if (t >= 0) {\n d = Math.floor(t / 1000 / 3600 / 24);\n h = Math.floor((t / 1000 / 60 / 60) % 24);\n m = Math.floor((t / 1000 / 60) % 60);\n s = Math.floor((t / 1000) % 60);\n }\n return {\n d,\n h,\n m,\n s,\n };\n};\n","/**\n * 描述: 全屏\n * @date 2022-08-16\n */\nexport let toFullScreen = function toFullScreen() {\n let elem = document.body;\n elem.webkitRequestFullScreen\n ? elem.webkitRequestFullScreen()\n : elem.mozRequestFullScreen\n ? elem.mozRequestFullScreen()\n : elem.msRequestFullscreen\n ? elem.msRequestFullscreen()\n : elem.requestFullScreen\n ? elem.requestFullScreen()\n : alert('浏览器不支持全屏');\n};\n","/**\n * 根据指定的两个日期,计算并返回中间的所有日期。\n * @date 2022-06-09\n * @param {String} startDay 开始日期 '2022-06-01'\n * @param {String} endDay 结束日期 '2022-06-09'\n * @returns {Array} 包含所有日期的集合 ['2022-06-01', '2022-06-02', '2022-06-03', '2022-06-04', '2022-06-05', '2022-06-06', '2022-06-07', '2022-06-08', '2022-06-09']\n */\nexport let twoDateBetweenAllDay = function twoDateBetweenAllDay(\n startDay,\n endDay\n) {\n let arr = [];\n let dates = [];\n // 设置两个日期 UTC 时间\n const sd = new Date(startDay);\n const ed = new Date(endDay);\n // 获取两个日期 GTM 时间\n const s = sd.getTime() - 24 * 60 * 60 * 1000;\n const e = ed.getTime() - 24 * 60 * 60 * 1000;\n // 获取到两个日期之间的每一天的毫秒数\n for (let i = s; i <= e; ) {\n i = i + 24 * 60 * 60 * 1000;\n arr.push(parseInt(i));\n }\n // 获取每一天的时间 YY-MM-DD\n for (const j in arr) {\n const time = new Date(arr[j]);\n const year = time.getFullYear(time);\n const month = String(time.getMonth() + 1).padStart(2, '0');\n const day = String(time.getDate()).padStart(2, '0');\n const YYMMDD = `${year}-${month}-${day}`;\n dates.push(YYMMDD);\n }\n return dates;\n};\n","/**\n * 两个日期之间的天数\n * @date 2022-06-16\n * @param {Date} startDay 开始日期 '2022-06-16'\n * @param {Date} endDay 结束日期 '2022-06-20'\n * @returns {Number} 两个日期之间的天数 4\n */\nexport let twoDaysBetweenNum = (startDay, endDay) => {\n if (\n startDay === '' ||\n startDay === null ||\n startDay === undefined ||\n endDay === '' ||\n endDay === null ||\n endDay === undefined\n ) {\n return null;\n }\n const startDate = Date.parse(startDay);\n const endDate = Date.parse(endDay);\n if (startDate == endDate) {\n return 0;\n }\n const days = (endDate - startDate) / (1 * 24 * 60 * 60 * 1000);\n return days;\n};\n","/*\n * @Author: wenreq 294491328@qq.com\n * @Date: 2022-11-09 21:17:24\n * @LastEditors: wenreq 294491328@qq.com\n * @LastEditTime: 2022-11-10 22:56:45\n * @FilePath: /realize-utils/src/array/uniqueArray.js\n * @Description:\n *\n * Copyright (c) 2022 by wenreq 294491328@qq.com, All Rights Reserved.\n */\n/**\n * 数组去除重复项\n * @date 2022-02-18\n * @param {Array} array 需要去重的数组\n * @returns {Array} 去重之后的数组,如果传入的不是数组则返回空数组。\n */\nexport let uniqueArray = function uniqueArray(array) {\n if (!Array.isArray(array)) {\n throw new Error('第一个参数必须是数组');\n }\n if (array.length == 1) {\n return array;\n }\n return [...new Set(array)];\n};\n","/*\n * @Author: wenreq 294491328@qq.com\n * @Date: 2022-11-09 21:17:24\n * @LastEditors: wenreq 294491328@qq.com\n * @LastEditTime: 2022-11-10 22:48:45\n * @FilePath: /realize-utils/src/dom/windowResize.js\n * @Description:\n *\n * Copyright (c) 2022 by wenreq 294491328@qq.com, All Rights Reserved.\n */\n/**\n * H5软键盘缩回、弹起回调\n * 当软件键盘弹起会改变当前 window.innerHeight, 监听这个值变化\n * @date 2022-02-24\n * @param {Function} downCb 当软键盘弹起后,缩回的回调\n * @param {any} upCb 当软键盘弹起的回调\n */\nexport let windowResize = function windowResize(downCb, upCb) {\n var clientHeight = window.innerHeight;\n downCb = typeof downCb === 'function' ? downCb : function () {};\n upCb = typeof upCb === 'function' ? upCb : function () {};\n window.addEventListener('resize', () => {\n var height = window.innerHeight;\n if (height === clientHeight) {\n downCb();\n }\n if (height < clientHeight) {\n upCb();\n }\n });\n};\n"],"names":["mergeArrayDelRepeat","timeout","result","hasClass","ele","cls","RegExp","test","className","setCookie","name","value","days","date","Date","setDate","getDate","document","cookie","toUTCString","getScrollTop","documentElement","scrollTop","body","setScrollTop","window","scrollTo","requestAnimFrame","requestAnimationFrame","webkitRequestAnimationFrame","callback","setTimeout","keyCodeMap","isComplexDataType","obj","_typeof","formater","t","Y","getFullYear","M","getMonth","D","H","getHours","m","getMinutes","s","getSeconds","replace","substring","str","from","to","k","i","indexOf","forEach","func","wait","immediate","context","this","args","arguments","clearTimeout","callNow","apply","debounced","deepClone","hash","length","undefined","WeakMap","constructor","has","get","allDesc","Object","getOwnPropertyDescriptors","cloneObj","create","getPrototypeOf","set","_step","_iterator","_createForOfIteratorHelper","Reflect","ownKeys","n","done","key","err","e","f","fraction","digit","unit","head","Math","abs","floor","pow","l","p","j","filename","data","downloadLink","createElement","appendChild","style","display","download","href","createEvent","downloadEvt","initEvent","dispatchEvent","createEventObject","fireEvent","onclick","removeChild","array1","array2","elem","parent","webkitCancelFullScreen","mozCancelFullScreen","cancelFullScreen","msExitFullscreen","exitFullscreen","alert","startTime","time","parse","day","parseInt","hour","min","month","year","difference","getTime","allSeconds","allMinutes","allHours","hours","minutes","seconds","concat","cookieArr","split","eleArr","decodeURIComponent","sys","ua","navigator","userAgent","toLowerCase","match","ie","edge","firefox","opera","chrome","safari","object","formData","FormData","keys","Array","isArray","subValue","append","keycode","console","log","appVersion","localStorage","getItem","JSON","error","date1","date2","date1_year","date1_month","date1_date","date2_year","date2_month","map","toDataURL","newArr","push","_toConsumableArray","Set","pos","left","top","offsetLeft","offsetTop","offsetParent","url","location","search","substr","lastIndexOf","query","pair","random","toString","slice","max","ceil","reg","removeItem","duration","diff","step","stringify","setItem","Error","res","parseFloat","toLocaleString","pairs","encodeURIComponent","join","filter","item1","find","item2","fn","_this","_len","_key","endTime","startDate","d","h","webkitRequestFullScreen","mozRequestFullScreen","msRequestFullscreen","requestFullScreen","startDay","endDay","arr","dates","sd","ed","String","padStart","YYMMDD","endDate","array","downCb","upCb","clientHeight","innerHeight","addEventListener","height"],"mappings":"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"} --------------------------------------------------------------------------------