Skip to content
ts
import type { AnyObject } from '@/interface/global';

/**
 * @description: 判断对象是否为空
 * @param {object} obj 对象
 * @return {boolean} 是否为空
 */
export function isNullObj(obj: AnyObject): boolean {
  return JSON.stringify(obj) === '{}';
}

/**
 * 首字母大写
 * @param keyword 需要转化的单词
 */
export function firstToUpperCase(keyword: string) {
  return keyword.slice(0, 1).toUpperCase() + keyword.slice(1);
}

/**
 * 判断是否是一个纯粹的对象(排除数组)
 * @returns boolean
 */
export function isPureObject(obj: AnyObject) {
  return typeof obj === 'object' && !Array.isArray(obj);
}

/**
 * 模拟延迟
 * @param time 时间,默认 2000ms
 */
export function mockDelay(time = 2000) {
  return new Promise((resolve) => {
    setTimeout(() => {
      resolve({});
    }, time);
  });
}

/**
 * 生成唯一值
 * @param length 生成唯一值的长度:默认5,最短3,最长11
 * @returns string
 */
export function randomID(length = 8) {
  return Math.random()
    .toString(36)
    .slice(-Math.max(3, Math.min(length, 11)));
}

/**
 * @description: 判断数字是否为安全类型,是则返回number类型,不是则返回string类型
 * @param {string | number} key
 * @return number|string
 */
export function safeKey(key: string | number) {
  const numKey = Number.parseInt(key as string, 10);
  return Number.isSafeInteger(numKey) ? numKey : key;
}

/**
 * 复制文本到剪切板
 * @param text 文本信息
 */
export const copyToClipboard = (text: string) => navigator.clipboard.writeText(text);

/**
 * 将rgb颜色灰度值(基于光感加权平均)
 */
export function gray(r: number, g: number, b: number) {
  return Math.round(0.2126 * r + 0.7152 * g + 0.0722 * b);
}

/**
 * 解析url中的参数
 * @param url 地址
 * http://a.com/abc?a=1&b=2
 * a=1&b=2
 */
export function parseQuery<R extends AnyObject>(url: string): R {
  const q: AnyObject = {};
  url.replace(/([^?&=]+)=([^&]+)/g, (_, k, v) => (q[k] = v));
  return q;
}

/**
 * 挑选对象属性
 * @param obj 目标对象
 * @argument 要挑选的属性名
 */
export function pickObjectKey<T = AnyObject>(obj: T, ...props: (keyof T)[]) {
  return Object.fromEntries(Object.entries(obj).filter(([k]) => props.includes(k as keyof T)));
}

/**
 * 随机HEX颜色
 */
export function randomHEXColor() {
  return `#${Math.floor(Math.random() * 0xffffff)
    .toString(16)
    .padEnd(6, '0')}`;
}

/**
 * 去除字符串中的元素标记
 * parseFromString('<div>Hello World</div>') // Hello World
 */
export function removeTag(fragment: string) {
  return new DOMParser().parseFromString(fragment, 'text/html').body.textContent || '';
}