├── .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 | [](https://github.com/wenreq/realize-utils)
2 |
3 | # realize-utils
4 |
5 | [](https://www.npmjs.com/package/realize-utils)
6 | [](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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"}
--------------------------------------------------------------------------------