封装一些常用函数方法
Posted yinuo_2
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了封装一些常用函数方法相关的知识,希望对你有一定的参考价值。
读本地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}`
}
格式化数字金额 数字大写
- 参数说明:
- number:要格式化的数字
- decimals:保留几位小数
- dec_point:小数点符号
- thousands_sep:千分位符号
export function format_money_point(number, decimals, dec_point, thousands_sep) {
number = (number + \'\').replace(/[^0-9+-Ee.]/g, \'\');
var n = !isFinite(+number) ? 0 : +number,
prec = !isFinite(+decimals) ? 2 : Math.abs(decimals),
sep = (typeof thousands_sep === \'undefined\') ? \',\' : thousands_sep,
dec = (typeof dec_point === \'undefined\') ? \'.\' : dec_point,
s = \'\',
toFixedFix = function(n, prec) {
var k = Math.pow(10, prec);
return \'\' + Math.ceil(n * k) / k;
};
s = (prec ? toFixedFix(n, prec) : \'\' + Math.round(n)).split(\'.\');
var re = /(-?\\d+)(\\d{3})/;
while (re.test(s[0])) {
s[0] = s[0].replace(re, "$1" + sep + "$2");
}
if ((s[1] || \'\').length < prec) {
s[1] = s[1] || \'\';
s[1] += new Array(prec - s[1].length + 1).join(\'0\');
}
return s.join(dec);
}
比较两个时间差
- @param {Object} beginTime
- @param {Object} endTime
export function timedDiff(beginTime, endTime) {
var dateBegin = new Date(beginTime);
var dateEnd = new Date(endTime);
var dateDiff = dateEnd.getTime() - dateBegin.getTime(); //时间差的毫秒数
var dayDiff = Math.floor(dateDiff / (24 * 3600 * 1000)); //计算出相差天数
var leave1 = dateDiff % (24 * 3600 * 1000); //计算天数后剩余的毫秒数
var hours = Math.floor(leave1 / (3600 * 1000)); //计算出小时数
//计算相差分钟数
var leave2 = leave1 % (3600 * 1000); //计算小时数后剩余的毫秒数
var minutes = Math.floor(leave2 / (60 * 1000)); //计算相差分钟数
//计算相差秒数
var leave3 = leave2 % (60 * 1000); //计算分钟数后剩余的毫秒数
var seconds = Math.round(leave3 / 1000);
return dayDiff;
// document.getElementById("show").innerhtml = "<h1>" + "相差" + dayDiff + "天" + hours + "小时" + minutes + "分钟" + seconds + "秒" + "</h1>";
}
以上是关于封装一些常用函数方法的主要内容,如果未能解决你的问题,请参考以下文章