164 lines
3.6 KiB
TypeScript
164 lines
3.6 KiB
TypeScript
import { orderBy } from "lodash-es";
|
|
|
|
export const { platform } = uni.getSystemInfoSync();
|
|
|
|
// 是否安卓
|
|
export const isAndroid = platform == "android";
|
|
|
|
// 是否苹果
|
|
export const isIos = platform == "ios";
|
|
|
|
// 是否小数
|
|
export function isDecimal(value: any): boolean {
|
|
return String(value).length - String(value).indexOf(".") + 1 > 0;
|
|
}
|
|
|
|
// 首字母大写
|
|
export function firstUpperCase(value: string): string {
|
|
return value.replace(/\b(\w)(\w*)/g, function ($0, $1, $2) {
|
|
return $1.toUpperCase() + $2;
|
|
});
|
|
}
|
|
|
|
// 深度合并
|
|
export function deepMerge(a: any, b: any) {
|
|
let k;
|
|
for (k in b) {
|
|
a[k] =
|
|
a[k] && a[k].toString() === "[object Object]" ? deepMerge(a[k], b[k]) : (a[k] = b[k]);
|
|
}
|
|
return a;
|
|
}
|
|
|
|
// 获取地址栏参数
|
|
export function getUrlParam(name: string): string | null {
|
|
const reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)");
|
|
const r = window.location.search.substr(1).match(reg);
|
|
if (r != null) return decodeURIComponent(r[2]);
|
|
return null;
|
|
}
|
|
|
|
// 列表转树形
|
|
export function deepTree(list: any[], sort?: "desc" | "asc"): any[] {
|
|
const newList: any[] = [];
|
|
const map: any = {};
|
|
|
|
orderBy(list, "orderNum", sort)
|
|
.map((e) => {
|
|
map[e.id] = e;
|
|
return e;
|
|
})
|
|
.forEach((e) => {
|
|
const parent = map[e.parentId];
|
|
|
|
if (parent) {
|
|
(parent.children || (parent.children = [])).push(e);
|
|
} else {
|
|
newList.push(e);
|
|
}
|
|
});
|
|
|
|
return newList;
|
|
}
|
|
|
|
// 路径转对象
|
|
export function path2Obj(list: any[]) {
|
|
const data: any = {};
|
|
|
|
list.forEach(({ path, value }) => {
|
|
const arr: string[] = path.split("/");
|
|
const parents = arr.slice(0, arr.length - 1);
|
|
const name = basename(path).replace(".ts", "");
|
|
|
|
let curr = data;
|
|
|
|
parents.forEach((k) => {
|
|
if (!curr[k]) {
|
|
curr[k] = {};
|
|
}
|
|
|
|
curr = curr[k];
|
|
});
|
|
|
|
curr[name] = value;
|
|
});
|
|
|
|
return data;
|
|
}
|
|
|
|
// 路径拼接
|
|
export function pathJoin(...parts: string[]): string {
|
|
if (parts.length === 0) {
|
|
return "";
|
|
}
|
|
|
|
const firstPart = parts[0];
|
|
let isAbsolute = false;
|
|
|
|
// 检查第一个部分是否以 "http" 开头,以确定路径类型(绝对还是相对)
|
|
if (firstPart.startsWith("http")) {
|
|
isAbsolute = true;
|
|
}
|
|
|
|
// 标准化路径,去除任何开头或结尾的斜杠
|
|
const normalizedParts = parts.map((part) => part.replace(/(^\/+|\/+$)/g, ""));
|
|
|
|
if (isAbsolute) {
|
|
// 如果是绝对路径,使用斜杠连接部分
|
|
return normalizedParts.join("/");
|
|
} else {
|
|
// 如果是相对路径,使用平台特定的分隔符连接部分
|
|
return normalizedParts.join("/");
|
|
}
|
|
}
|
|
|
|
// 文件名
|
|
export function filename(path: string): string {
|
|
return basename(path.substring(0, path.lastIndexOf(".")));
|
|
}
|
|
|
|
// 路径名称
|
|
export function basename(path: string): string {
|
|
let index = path.lastIndexOf("/");
|
|
index = index > -1 ? index : path.lastIndexOf("\\");
|
|
if (index < 0) {
|
|
return path;
|
|
}
|
|
return path.substring(index + 1);
|
|
}
|
|
|
|
// 文件扩展名
|
|
export function extname(path: string): string {
|
|
return path.substring((path || "").lastIndexOf(".") + 1);
|
|
}
|
|
|
|
// 横杠转驼峰
|
|
export function toCamel(str: string): string {
|
|
return str.replace(/([^-])(?:-+([^-]))/g, function ($0, $1, $2) {
|
|
return $1 + $2.toUpperCase();
|
|
});
|
|
}
|
|
|
|
// uuid
|
|
export function uuid(): string {
|
|
const s: any[] = [];
|
|
const hexDigits = "0123456789abcdef";
|
|
for (let i = 0; i < 36; i++) {
|
|
s[i] = hexDigits.substr(Math.floor(Math.random() * 0x10), 1);
|
|
}
|
|
s[14] = "4";
|
|
s[19] = hexDigits.substr((s[19] & 0x3) | 0x8, 1);
|
|
s[8] = s[13] = s[18] = s[23] = "-";
|
|
|
|
return s.join("");
|
|
}
|
|
|
|
// 延迟
|
|
export function sleep(duration: number) {
|
|
return new Promise((resolve) => {
|
|
setTimeout(() => {
|
|
resolve(true);
|
|
}, duration);
|
|
});
|
|
}
|