LtyhShop/pc/utils/util.ts
2025-04-09 14:59:26 +08:00

212 lines
5.5 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* @description 添加单位
* @param {String | Number} value 值 100
* @param {String} unit 单位 px em rem
*/
export const addUnit = (value: string | number, unit = 'px') => {
return !Object.is(Number(value), NaN) ? `${value}${unit}` : value
}
/**
* @description 树转数组,队列实现广度优先遍历
* @param {Array} data 数据
* @param {Object} props `{ children: 'children' }`
*/
export const treeToArray = (data: any[], props = { children: 'children' }) => {
data = JSON.parse(JSON.stringify(data))
const { children } = props
const newData = []
const queue: any[] = []
data.forEach((child: any) => queue.push(child))
while (queue.length) {
const item: any = queue.shift()
if (item[children]) {
item[children].forEach((child: any) => queue.push(child))
delete item[children]
}
newData.push(item)
}
return newData
}
/**
* @description 获取正确的路经
* @param {String} path 数据
*/
export function getNormalPath(path: string) {
if (path.length === 0 || !path || path == 'undefined') {
return path
}
const newPath = path.replace('//', '/')
const length = newPath.length
if (newPath[length - 1] === '/') {
return newPath.slice(0, length - 1)
}
return newPath
}
//加法函数,用来得到精确的加法结果
//说明javascript的加法结果会有误差在两个浮点数相加的时候会比较明显。这个函数返回较为精确的加法结果。
//返回值arg1加上arg2的精确结果
export function Add(arg1: number, arg2: number) {
arg2 = parseFloat(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(100, Math.max(r1, r2))
return (Mul(arg1, m) + Mul(arg2, m)) / m
}
//乘法函数,用来得到精确的乘法结果
//说明javascript的乘法结果会有误差在两个浮点数相乘的时候会比较明显。这个函数返回较为精确的乘法结果。
//返回值arg1乘以arg2的精确结果
export function Mul(arg1: number | string, arg2: number | string) {
arg1 = parseFloat(arg1)
arg2 = parseFloat(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)
}
//除法函数,用来得到精确的除法结果
//说明javascript的除法结果会有误差在两个浮点数相除的时候会比较明显。这个函数返回较为精确的除法结果。
//调用:$h.Div(arg1,arg2)
//返回值arg1除以arg2的精确结果
export function Div(arg1: number | string, arg2: number | string) {
arg1 = parseFloat(arg1);
arg2 = parseFloat(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) {}
r1 = Number(arg1.toString().replace(".", ""));
r2 = Number(arg2.toString().replace(".", ""));
return Mul(r1 / r2, Math.pow(10, t2 - t1));
}
/**
* 将字符串转换为布尔值
* @param s
*/
export function stringToBool(s: string): boolean {
if (s.toLowerCase() === 'true' || s === '1') {
return true
} else if (s.toLowerCase() === 'false' || s === '0') {
return false
} else {
return false
}
}
/**
* Base64 转换为 Blob 对象的辅助函数
* @param s
*/
export function b64toBlob(base64: string) {
const byteCharacters = atob(base64.split(',')[1]);
const byteArrays = [];
for (let offset = 0; offset < byteCharacters.length; offset += 512) {
const slice = byteCharacters.slice(offset, offset + 512);
const byteNumbers = new Array(slice.length);
for (let i = 0; i < slice.length; i++) {
byteNumbers[i] = slice.charCodeAt(i);
}
const byteArray = new Uint8Array(byteNumbers);
byteArrays.push(byteArray);
}
return new Blob(byteArrays, { type: 'image/png' });
}
/**
* 函数防抖 (只执行最后一次点击)
* @param fn
* @returns {Function}
* @constructor
*/
export const Debounce = (fn:any, t:any) => {
const delay = t || 500
let timer
return function () {
const args = arguments
if (timer) {
clearTimeout(timer)
}
timer = setTimeout(() => {
timer = null
fn.apply(this, args)
}, delay)
}
}
/**优惠券展示的使用有效期均根据今天进行判断,
* 没到使用期的展示「开始日期-结束日期 有效」,
* 已经可以使用的展示「有效期至 结束日期」
* @param startTime
* @param endTime
*/
export const getCouponTime = (startTime: string, endTime: string) => {
let start:number = new Date(startTime).getTime()
let newTime:number = Date.now()
let reg:RegExp = new RegExp('-', 'g') //g代表全部
if (newTime < start) {
return startTime.slice(0, 16).replace(reg, '.') + ' ~ ' + endTime.slice(0, 16).replace(reg, '.') + ' 可用'
} else {
return '有效期至 ' + endTime.slice(0, 16).replace(reg, '.')
}
}
/**
* 页面路由跳转
* @param url 跳转地址
* @param query 携带参数
* @param replace 是否刷新页面
*/
export const linkNavigateTo = (url: string, params = {}, replace: boolean = false): void => {
navigateTo(
{
path: url,
query: params,
},
{
replace: replace,
},
)
}
/**
* 链接跳转
*/
export const linkJump=(url:string)=>{
if (url.indexOf("http") !== -1) {
window.open(url)
}else{
linkNavigateTo(url)
}
}