/** * 高频事件触发,但在n秒内只会执行一次,所以节流会稀释函数的执行频率 */ export function throttle(func, wait = 300) { let isOK = true; // 标志位 return function () { if (!isOK) { return; } isOK = false; setTimeout(() => { func.apply(this, arguments); isOK = true; }, wait); }; } /** * 触发高频事件后n秒内函数只会执行一次,如果n秒内高频事件再次被触发,则重新计算时间 */ export function debounce(func, wait = 500, immediate = false) { let timer; let result; return function () { if (timer) { clearTimeout(timer); } if (immediate) { if (!timer) { result = func.apply(this, arguments); } } else { // this 指向 和 event 指向; => 和 apply timer = setTimeout(() => { result = func.apply(this, arguments); }, wait); } return result; }; } // 登录后才会继续执行 export async function doAfterLogin() { let app = getApp(); return new Promise(async (reslove, reject) => { let i = 1; while (app.globalData.token == '' || app.globalData.gridId == '' || app.globalData.currentGridName == '') { // 等了一会还不行就重新登录 i += 1; if (i == 10 || i == 100 || i == 250 || i == 600 || i % 3000 == 0) { if (await appLogin()) { return reslove(); } } await nextTick(100); } return reslove(); }); } /** * 根据元素大小排序 * key:元素 * desc:true 升序 false 降序 */ export function compare(key, desc) { return function (a, b) { let value1 = a[key]; let value2 = b[key]; if (desc == true) { // 升序排列 return value1 - value2; } else { // 降序排列 return value2 - value1; } }; } /** * 四舍五入 自定义小数位数,空缺补0 */ export function round(num, n) { let dd = 1; let tempnum; for (let i = 0; i < n; i++) { dd *= 10; } tempnum = num * dd; tempnum = Math.round(tempnum); return formatnumber(tempnum / dd, n); } export function formatnumber(value, num) { var a; var b; var c; var i; a = value.toString(); b = a.indexOf('.'); c = a.length; if (num == 0) { if (b != -1) { a = a.substring(0, b); } } else { if (b == -1) { a = a + '.'; for (i = 1; i <= num; i++) { a = a + '0'; } } else { a = a.substring(0, b + num + 1); for (i = c; i <= b + num; i++) { a = a + '0'; } } } return a; } export function byteConvert(bytes) { if (isNaN(bytes)) { return ''; } var symbols = ['bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB']; var exp = Math.floor(Math.log(bytes) / Math.log(2)); if (exp < 1) { exp = 0; } var i = Math.floor(exp / 10); bytes = bytes / Math.pow(2, 10 * i); if (bytes.toString().length > bytes.toFixed(2).toString().length) { bytes = bytes.toFixed(2); } return bytes + ' ' + symbols[i]; } var x_PI = 52.35987755982988; var PI = 3.141592653589793; var a = 6378245; var ee = 0.006693421622965943; export function gcj02tobd09(lng, lat) { var z = Math.sqrt(lng * lng + lat * lat) + 0.00002 * Math.sin(lat * x_PI); var theta = Math.atan2(lat, lng) + 0.000003 * Math.cos(lng * x_PI); var bd_lng = z * Math.cos(theta) + 0.0065; var bd_lat = z * Math.sin(theta) + 0.0064; return [bd_lng, bd_lat]; } export function wgs84togcj02(lng, lat) { let dlat = transformlat(lng - 105, lat - 35); let dlng = transformlng(lng - 105, lat - 35); let radlat = (lat / 180) * PI; let magic = Math.sin(radlat); magic = 1 - ee * magic * magic; let sqrtmagic = Math.sqrt(magic); dlat = (dlat * 180) / (((a * (1 - ee)) / (magic * sqrtmagic)) * PI); dlng = (dlng * 180) / ((a / sqrtmagic) * Math.cos(radlat) * PI); let mglat = lat + dlat; let mglng = lng + dlng; console.log(mglng, mglat); return [mglng, mglat]; } export function gcj02_to_wgs84(lng, lat) { let dlat = transformlat(lng - 105, lat - 35); let dlng = transformlng(lng - 105, lat - 35); let radlat = (lat / 180) * PI; let magic = Math.sin(radlat); magic = 1 - ee * magic * magic; let sqrtmagic = Math.sqrt(magic); dlat = (dlat * 180) / (((a * (1 - ee)) / (magic * sqrtmagic)) * PI); dlng = (dlng * 180) / ((a / sqrtmagic) * Math.cos(radlat) * PI); let mglat = lat + dlat; let mglng = lng + dlng; return [lng * 2 - mglng, lat * 2 - mglat]; } function transformlat(lng, lat) { var ret = -100 + 2 * lng + 3 * lat + 0.2 * lat * lat + 0.1 * lng * lat + 0.2 * Math.sqrt(Math.abs(lng)); ret += ((20 * Math.sin(6 * lng * PI) + 20 * Math.sin(2 * lng * PI)) * 2) / 3; ret += ((20 * Math.sin(lat * PI) + 40 * Math.sin((lat / 3) * PI)) * 2) / 3; ret += ((160 * Math.sin((lat / 12) * PI) + 320 * Math.sin((lat * PI) / 30)) * 2) / 3; return ret; } function transformlng(lng, lat) { var ret = 300 + lng + 2 * lat + 0.1 * lng * lng + 0.1 * lng * lat + 0.1 * Math.sqrt(Math.abs(lng)); ret += ((20 * Math.sin(6 * lng * PI) + 20 * Math.sin(2 * lng * PI)) * 2) / 3; ret += ((20 * Math.sin(lng * PI) + 40 * Math.sin((lng / 3) * PI)) * 2) / 3; ret += ((150 * Math.sin((lng / 12) * PI) + 300 * Math.sin((lng / 30) * PI)) * 2) / 3; return ret; } export function getFileType(name) { return name.substring(name.lastIndexOf('.') + 1); } export function arrayToString(arr = []) { if (arr.length <= 0) { return ''; } return arr.join(','); } export function stringToArray(str) { if (str.length <= 0) { return []; } return str.split(','); } export function formatNull(test) { if (test === null) { return ''; } else { return test; } } // 校验是否为空 function isEmpty(test) { if (test === null || test === '') { return true; } else { return false; } } // 是否是有效手机号码 function isPhone(phone) { if (isEmpty(phone)) { return false; } let error = /^1[3456789]\d{9}$/.test(phone); return error; } // 身份证是否有效 // function isCardId(card) { // if (isEmpty(card)) return false // return /(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/.test(card) // } // 是否是有效车牌 function isVehicleId(num) { if (isEmpty(num)) { return false; } return ( /^(([京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领][A-Z](([0-9]{5}[DF])|([DF]([A-HJ-NP-Z0-9])[0-9]{4})))|([京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领][A-Z][A-HJ-NP-Z0-9]{4}[A-HJ-NP-Z0-9挂学警港澳使领]))$/.test( num ) || /^(([京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领][a-z](([0-9]{5}[df])|([df]([a-hj-np-z0-9])[0-9]{4})))|([京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领][a-z][a-hj-np-z0-9]{4}[a-hj-np-z0-9挂学警港澳使领]))$/.test( num ) ); } function isNumber(num) { if (isEmpty(num)) { return false; } let error = /^[0-9]+.{0,1}[0-9]{0,2}$/.test(num); return error; } export function isObject(value) { return value != null && (typeof value === 'object' || typeof value === 'function'); } function isCardId(num) { let idcard = num; if (idcard == '') { return false; } let regex1 = /^[1-9][0-7]\d{4}((([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3})(((0[13578]|1[02])(0[1-9]|[12][0-9]|3[01]))|((0[469]|11)(0[1-9]|[12][0-9]|30))|(02(0[1-9]|[1][0-9]|2[0-8]))))|((([0-9]{2})(0[48]|[2468][048]|[13579][26])|((0[48]|[2468][048]|[3579][26])00))0229))\d{3}(\d|X|x)?$/; // 身份号码位数及格式检验 let regex2 = ''; switch (idcard.length) { case 15: if ((parseInt(idcard.substr(6, 2)) + 1900) % 4 == 0 || ((parseInt(idcard.substr(6, 2)) + 1900) % 100 == 0 && (parseInt(idcard.substr(6, 2)) + 1900) % 4 == 0)) { regex2 = /^[1-9][0-9]{5}[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{3}$/; // 测试出生日期的合法性 } else { regex2 = /^[1-9][0-9]{5}[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))[0-9]{3}$/; // 测试出生日期的合法性 } if (regex2.test(idcard)) { return true; } else { return false; } case 18: if (regex1.test(idcard)) { let S = (parseInt(idcard[0]) + parseInt(idcard[10])) * 7 + (parseInt(idcard[1]) + parseInt(idcard[11])) * 9 + (parseInt(idcard[2]) + parseInt(idcard[12])) * 10 + (parseInt(idcard[3]) + parseInt(idcard[13])) * 5 + (parseInt(idcard[4]) + parseInt(idcard[14])) * 8 + (parseInt(idcard[5]) + parseInt(idcard[15])) * 4 + (parseInt(idcard[6]) + parseInt(idcard[16])) * 2 + parseInt(idcard[7]) * 1 + parseInt(idcard[8]) * 6 + parseInt(idcard[9]) * 3; let Y = S % 11; let M = 'F'; let JYM = '10X98765432'; M = JYM.substr(Y, 1); // 判断校验位 if (M == idcard[17].toUpperCase()) { return true; } else { return false; } } else { return false; } default: return false; } } export const RegexTool = { isEmpty, isPhone, isCardId, isVehicleId, isNumber, isObject };