读本地json
export function readTextFile(file, callback) { var rawFile = new XMLHttpRequest(); rawFile.overrideMimeType("application/json"); rawFile.open("GET", file, true); rawFile.onreadystatechange = function() { if (rawFile.readyState === 4 && rawFile.status == "200") { var res = JSON.parse(rawFile.responseText) callback(res); } } rawFile.send(null);}
判断是否为数字 true:数值型的,false:非数值型
export function isRealNum(val) { // isNaN()函数 把空串 空格 以及NUll 依照0来解决 所以先去除, if (val === "" || val == null) { return false; } if (!isNaN(val)) { //对于空数组和只有一个数值成员的数组或全是数字组成的字符串,isNaN返回false,例如:'123'、[]、[2]、['123'],isNaN返回false, //所以如果不须要val蕴含这些非凡状况,则这个判断改写为if(!isNaN(val) && typeof val === 'number' ) return true; } else { return false; }}
判断是否为空 如果是undefined, null, '', NaN,false,0,[],{} ,空白字符串,都返回true,否则返回false
export function isEmpty(v) { switch (typeof v) { case 'undefined': return true; case 'string': if (v.replace(/(^[ \t\n\r]*)|([ \t\n\r]*$)/g, '').length == 0) return true; break; case 'boolean': if (!v) return true; break; case 'number': if (0 === v || isNaN(v)) return true; break; case 'object': if (null === v || v.length === 0) return true; for (var i in v) { return false; } return true; } return false;}
数组依据数组对象中的某个属性值进行排序的办法
- 数组依据数组对象中的某个属性值进行排序的办法
- 应用例子:newArray.sort(sortBy('number',false)) //示意依据number属性降序排列;若第二个参数不传递,默认示意升序排序
- @param attr 排序的属性 如number属性
- @param rev true示意升序排列,false降序排序
export function sortBy(attr, rev) { //第二个参数没有传递 默认升序排列 if (rev == undefined) { rev = 1; } else { rev = (rev) ? 1 : -1; } return function(a, b) { a = a[attr]; b = b[attr]; if (a < b) { return rev * -1; } if (a > b) { return rev * 1; } return 0; }}
判断是否为手机号
export function isPoneAvailable(str) { var myreg = /^[1][3,4,5,7,8][0-9]{9}$/; if (!myreg.test(str)) { return false; } else { return true; }}
函数节流办法
- @param Function fn 延时调用函数
- @param Number delay 提早多长时间
- @param Number atleast 至多多长时间触发一次
- @return Function 提早执行的办法
export function throttle(fn, delay = 500, atleast = 1000) { var timer = null; var previous = null; return function() { var now = +new Date(); if (!previous) previous = now; if (atleast && now - previous > atleast) { fn(); // 重置上一次开始工夫为本次完结工夫 previous = now; clearTimeout(timer); } else { clearTimeout(timer); timer = setTimeout(function() { fn(); previous = null; }, delay); } }}
string To Byt(base64)
export function stringToByte(base64) { var arr = base64.split(',') var str = atob(arr[1]) var bytes = [] var len, c len = str.length for (var i = 0; i < len; i++) { c = str.charCodeAt(i) if (c >= 0x010000 && c <= 0x10FFFF) { bytes.push(((c >> 18) & 0x07) | 0xF0) bytes.push(((c >> 12) & 0x3F) | 0x80) bytes.push(((c >> 6) & 0x3F) | 0x80) bytes.push((c & 0x3F) | 0x80) } else if (c >= 0x000800 && c <= 0x00FFFF) { bytes.push(((c >> 12) & 0x0F) | 0xE0) bytes.push(((c >> 6) & 0x3F) | 0x80) bytes.push((c & 0x3F) | 0x80) } else if (c >= 0x000080 && c <= 0x0007FF) { bytes.push(((c >> 6) & 0x1F) | 0xC0) bytes.push((c & 0x3F) | 0x80) } else { bytes.push(c & 0xFF) } } return bytes}
工夫形象化
export function fmtDateVisualization(time) { //#ifdef APP-PLUS //app 端应用以下办法有误,暂不知 起因,间接截取返回 return time.slice(0, 10); //#endif if (!time) { return '未知'; } var newDate = new Date(time); var updateTime = newDate.getTime(); let now = new Date().getTime() let second = Math.floor((now - updateTime) / (1000)) let minute = Math.floor(second / 60) let hour = Math.floor(minute / 60) let day = Math.floor(hour / 24) let month = Math.floor(day / 31) let year = Math.floor(month / 12) if (month > 0) { let rq = newDate.getFullYear() + '-' + (newDate.getMonth() + 1) + '-' + newDate.getDate(); return rq; } else if (day > 0) { let ret = day + '天前' if (day >= 7 && day < 14) { ret = '1周前' } else if (day >= 14 && day < 21) { ret = '2周前' } else if (day >= 21 && day < 28) { ret = '3周前' } else if (day >= 28 && day < 31) { ret = '4周前' } return ret } else if (hour > 0) { return hour + '小时前' } else if (minute > 0) { return minute + '分钟前' } else if (second > 0) { return second + '秒前' } else { return '刚刚' }}
判断obj是否为一个整数
function isInteger(obj) { return Math.floor(obj) === obj}
将一个浮点数转成整数,返回整数和倍数。
- 如 3.14 >> 314,倍数是 100
- @param floatNum {number} 小数
- @return {object}
- {times:100, num: 314}
function toInteger(floatNum) { var ret = { times: 1, num: 0 }; if (isInteger(floatNum)) { ret.num = floatNum; return ret } var strfi = floatNum + ''; var dotPos = strfi.indexOf('.'); var len = strfi.substr(dotPos + 1).length; var times = Math.pow(10, len); var intNum = parseInt(floatNum * times + 0.5, 10); ret.times = times; ret.num = intNum; return ret}
外围办法,实现加减乘除运算,确保不失落精度
- 思路:把小数放大为整数(乘),进行算术运算,再放大为小数(除)
- @param a {number} 运算数1
- @param b {number} 运算数2
- @param op {string} 运算类型,有加减乘除(add/subtract/multiply/divide)
function operation(a, b, op) { var o1 = toInteger(a); var o2 = toInteger(b); var n1 = o1.num; var n2 = o2.num; var t1 = o1.times; var t2 = o2.times; var max = t1 > t2 ? t1 : t2; var result = null; switch (op) { case 'add': if (t1 === t2) { // 两个小数位数雷同 result = n1 + n2 } else if (t1 > t2) { // o1 小数位 大于 o2 result = n1 + n2 * (t1 / t2) } else { // o1 小数位 小于 o2 result = n1 * (t2 / t1) + n2 } return result / max; case 'subtract': if (t1 === t2) { result = n1 - n2 } else if (t1 > t2) { result = n1 - n2 * (t1 / t2) } else { result = n1 * (t2 / t1) - n2 } return result / max; case 'multiply': result = (n1 * n2) / (t1 * t2); return result; case 'divide': result = (n1 / n2) * (t2 / t1); return result }}
加减乘除的四个接口
export function add(a, b) { return operation(a, b, 'add')}export function subtract(a, b) { return operation(a, b, 'subtract')}export function multiply(a, b) { return operation(a, b, 'multiply')}export function divide(a, b) { return operation(a, b, 'divide')}
深拷贝
export function deepCopy(obj) { if (typeof obj !== 'object') return; var newObj = obj instanceof Array ? [] : {}; for (var key in obj) { if (obj.hasOwnProperty(key)) { newObj[key] = typeof obj[key] === 'object' ? deepCopy(obj[key]) : obj[key]; } } return newObj;}
js对象深度合并
export function deepMixins(...objArr) { let ret = {} function handler(key, source, ret) { let isObj = typeof source[key] == "object" //判断是否是对象 if (isObj) { if (!ret[key]) { ret[key] = {} //键名不存在,拷贝键名 } // 因为是对象、递归深度拷贝 Object.keys(source[key]).forEach((_key) => { handler(_key, source[key], ret[key]) }) } else { // 是非援用类型、间接拷贝键名所对应的值 ret[key] = source[key] } } // 遍历须要拷贝的对象、逐个深度拷贝 objArr.forEach((obj, idx, _self) => { Object.keys(obj).forEach((key) => { handler(key, obj, ret) }) }) return ret}
获取以后路由
export function getCurRoute() { let routes = getCurrentPages() // 获取以后关上过的页面路由数组 let curRoute = routes[routes.length - 1].route // 获取以后页面路由,也就是最初一个关上的页面路由 return curRoute}
base64转本地图片,将数据存储在本地 微信小程序应用
export function base64ToSave(base64data, path = 'tmp_base64src') { return new Promise((resolve, reject) => { var [, format, bodyData] = /data:image\/(\w+);base64,(.*)/.exec(base64data) || []; if (!format) { reject(new Error('ERROR_BASE64SRC_PARSE')); } let filePath = `${wx.env.USER_DATA_PATH}/${path}`; wx.getFileSystemManager().writeFile({ filePath: filePath, data: wx.base64ToArrayBuffer(bodyData), encoding: 'binary', success: () => { console.log('写入胜利, 门路: ', filePath); resolve(filePath); }, fail: err => { console.log('写入失败, fail: ', err); reject('写入失败:', err); }, }); });}
革除临时文件
export function removeSave(filePath) { return new Promise((resolve, reject) => { // 把文件删除后再写进,避免超过最大范畴而无奈写入 wx.getFileSystemManager().unlink({ filePath: filePath, success: res => { console.log('删除胜利, 门路: ', filePath); // resolve(saveFilePath); }, fail: err => { console.log('删除失败, err: ', err); // reject('删除失败:', err); } }) })}
获取以后工夫并格式化
export function getNowTime() { const time = new Date() let y = time.getFullYear() let m = time.getMonth() + 1 let d = time.getDate() let h = time.getHours() let mi = time.getMinutes() let s = time.getSeconds() m = m < 10 ? `0${m}` : m d = d < 10 ? `0${d}` : d h = h < 10 ? `0${h}` : h mi = mi < 10 ? `0${mi}` : mi s = s < 10 ? `0${s}` : s return `${y}-${m}-${d} ${h}:${mi}:${s}`}
读本
读本
读本