收集常用代码
# 常用js
收集一些js操作,可能以后还会用到
# 不定个数的开始与结束日期重叠判断
const data =[
{startDay:'2022-12-23',endDay:'2023-12-24'},
{startDay:'2022-04-23',endDay:'2023-02-24'},
{startDay:'2022-11-23',endDay:'2023-11-24'}
]
function isRepeat(data){
const okData = []
// 将所有开始时间和结束时间划分为两个数组
const start = data.map((i) => i.startDay).sort()
const end = data.map((i) => i.endDay).sort()
for (let i = 1; i < start.length; i++) {
if (start[i] <= end[i - 1]) {
// 有重复
okData.push(true)
} else {
// 无重复
okData.push(false)
}
}
//找到true为重复
return okData.includes(true)
}
isRepeat(data)
//还可以进行时间的判断,只需改为'2022-12-23 10:01:32'即可
# 按照空格和换行截取字符串进行操作
const str="百度 https://baidu.com" //多个使用换行分割
let data = str.split(/[\n]/g).filter(item => Boolean(item)) //按照换行截取并过滤虚值(例如用户意外输入的空格)
const data2 = data.map(item => {
if (item) {
return {
name: item.split(/\s/g)[0],
url: item.split(/\s/g)[1]
}
}
})
// data2:[{ name:百度,url:https://baidu.com}]
# 小数计算丢失精度问题
//除法函数,用来得到精确的除法结果
//说明:javascript的除法结果会有误差,在两个浮点数相除的时候会比较明显。这个函数返回较为精确的除法结果。
//调用:accDiv(arg1,arg2)
//返回值:arg1除以arg2的精确结果
function accDiv(arg1, arg2) {
var t1 = 0, t2 = 0, r1, r2;
try { t1 = arg1.toString().split(".")[1].length } catch (e) { }
try { t2 = arg2.toString().split(".")[1].length } catch (e) { }
with (Math) {
r1 = Number(arg1.toString().replace(".", ""));
r2 = Number(arg2.toString().replace(".", ""));
return (r1 / r2) * pow(10, t2 - t1);
}
}
//给Number类型增加一个div方法,调用起来更加方便。
Number.prototype.div = function (arg) {
return accDiv(this, arg);
};
//乘法函数,用来得到精确的乘法结果
//说明:javascript的乘法结果会有误差,在两个浮点数相乘的时候会比较明显。这个函数返回较为精确的乘法结果。
//调用:accMul(arg1,arg2)
//返回值:arg1乘以arg2的精确结果
function accMul(arg1, arg2) {
var m = 0, s1 = arg1.toString(), s2 = arg2.toString();
try { m += s1.split(".")[1].length } catch (e) { }
try { m += s2.split(".")[1].length } catch (e) { }
return Number(s1.replace(".", "")) * Number(s2.replace(".", "")) / Math.pow(10, m);
}
//给Number类型增加一个mul方法,调用起来更加方便。
Number.prototype.mul = function (arg) {
return accMul(arg, this);
};
//加法函数,用来得到精确的加法结果
//说明:javascript的加法结果会有误差,在两个浮点数相加的时候会比较明显。这个函数返回较为精确的加法结果。
//调用:accAdd(arg1,arg2)
//返回值:arg1加上arg2的精确结果
function accAdd(arg1, arg2) {
var r1, r2, m;
try { r1 = arg1.toString().split(".")[1].length } catch (e) { r1 = 0 }
try { r2 = arg2.toString().split(".")[1].length } catch (e) { r2 = 0 }
m = Math.pow(10, Math.max(r1, r2));
return (arg1 * m + arg2 * m) / m;
}
//给Number类型增加一个add方法,调用起来更加方便。
Number.prototype.add = function (arg) {
return accAdd(arg, this);
}
//减法函数
function accSub(arg1, arg2) {
var r1, r2, m, n;
try { r1 = arg1.toString().split(".")[1].length } catch (e) { r1 = 0 }
try { r2 = arg2.toString().split(".")[1].length } catch (e) { r2 = 0 }
m = Math.pow(10, Math.max(r1, r2));
//last modify by deeka
//动态控制精度长度
n = (r1 >= r2) ? r1 : r2;
return ((arg2 * m - arg1 * m) / m).toFixed(n);
}
///给number类增加一个sub方法,调用起来更加方便
Number.prototype.sub = function (arg) {
return accSub(arg, this);
}
转载自:js浮点运算bug的解决办法 - 飞得更高 - 博客园 (cnblogs.com) (opens new window)
编辑 (opens new window)
上次更新: 2022/05/28, 10:34:23