常用 utils

常用工具函数

General

isEmpty

export function isEmpty(data: any) {
  if (data === '' || data === null || data === undefined) {
    return true;
  }
  // [] {} 0 false/true
  else {
    const typeofs = Object.prototype.toString.call(data);
    // 数组
    if (typeofs === '[object Array]') {
      if (data.length > 0) {
        return false;
      } else {
        return true;
      }
    }
    // 对象
    else if (typeofs === '[object Object]') {
      if (Object.keys(data).length > 0) {
        return false;
      } else {
        return true;
      }
    } else {
      // 不为空
      return false;
    }
  }
}

getType

type Types =
  | 'Number'
  | 'String'
  | 'Boolean'
  | 'Null'
  | 'Undefined'
  | 'Array'
  | 'Object';

export const getType = function (value: any): Types {
  const typeofs = Object.prototype.toString.call(value);

  switch (typeofs) {
    case '[object Number]':
      return 'Number'; // NaN Infinity 也是Number类型

    case '[object String]':
      return 'String';

    case '[object Boolean]':
      return 'Boolean';

    case '[object Null]':
      return 'Null';

    case '[object Undefined]':
      return 'Undefined';

    case '[object Array]':
      return 'Array';

    case '[object Object]':
      return 'Object';

    default:
      return typeofs as any;
  }
};

is

import { getType } from './get-type';

const typeCheck = function (type: string, val: any): boolean {
  if (getType(val) === type) {
    return true;
  } else {
    return false;
  }
};

type TypeChecking = {
  number: (val: any) => boolean;
  string: (val: any) => boolean;
  array: (val: any) => boolean;
  object: (val: any) => boolean;
};

export const is: TypeChecking = {
  number: (val: any) => {
    return Number.isFinite(val);
  },
  string: (val: any) => {
    return typeCheck('String', val);
  },
  array: (val: any) => {
    return typeCheck('Array', val);
  },
  object: (val: any) => {
    return typeCheck('Object', val);
  },
};

isEqual

isEqual:判断两个数据是否相等
isObjectEqual:判断两个对象是否相等
isArrayEqual:判断两个数组是否相等

import { isEmpty } from './isEmpty';

type IndexKey = string | number | symbol;
interface AnyObject {
  [propName: IndexKey]: any;
}

/**
 * @description 判断两个对象是否相等
 * @param {AnyObject} obj1
 * @param {AnyObject} obj2
 * @param {boolean} omitEmpty 默认为false,当为true时,为空的值判断为相等
 * @return {boolean}
 */
export const isObjectEqual = function (
  obj1: AnyObject,
  obj2: AnyObject,
  omitEmpty = false
) {
  const keys1 = Object.keys(obj1);
  const keys2 = Object.keys(obj2);

  if (keys1.length === keys2.length) {
    const sortKeys1 = keys1.sort();
    const sortKeys2 = keys2.sort();

    const sortStr1 = JSON.stringify(sortKeys1);
    const sortStr2 = JSON.stringify(sortKeys2);

    // 对象的key值都相等
    if (sortStr1 === sortStr2) {
      let flag = true;
      for (const key1 in obj1) {
        const value1 = obj1[key1];
        const value2 = obj2[key1];
        const typeofs = Object.prototype.toString.call(value1);
        const typeofs2 = Object.prototype.toString.call(value2);

        // 如果两个都为空,判断为相等
        if (omitEmpty && isEmpty(value1) && isEmpty(value2)) {
          // flag = true;
        } else {
          if (typeofs === '[object Object]' && typeofs2 === '[object Object]') {
            const _flag = isObjectEqual(value1, value2, omitEmpty);
            if (!_flag) {
              flag = false;
              break;
            }
          } else if (
            typeofs === '[object Array]' &&
            typeofs2 === '[object Array]'
          ) {
            const _flag = isArrayEqual(value1, value2, omitEmpty);
            if (!_flag) {
              flag = false;
              break;
            }
          } else if (typeofs === typeofs2) {
            // string number boolean null undefined
            if (value1 !== value2) {
              flag = false;
              break;
            }
          } else {
            // 类型不同,不相等
            flag = false;
            break;
          }
        }
      }
      return flag;
    } else {
      return false;
    }
  } else {
    return false;
  }
};

/**
 * @description 判断两个数组是否相等
 * @param {any[]} arr1
 * @param {any[]} arr2
 * @param {boolean} omitEmpty 默认为false,当为true时,为空的值判断为相等
 * @return {boolean}
 */
export const isArrayEqual = function (
  arr1: any[],
  arr2: any[],
  omitEmpty = false
) {
  if (arr1.length === arr2.length) {
    let flag = true;
    let i = 0;
    for (const item of arr1) {
      const value1 = item;
      const value2 = arr2[i];
      const typeofs = Object.prototype.toString.call(value1);
      const typeofs2 = Object.prototype.toString.call(value2);

      // 如果两个都为空,判断为相等
      if (omitEmpty && isEmpty(value1) && isEmpty(value2)) {
        // flag = true;
      } else {
        if (typeofs === '[object Object]' && typeofs2 === '[object Object]') {
          const _flag = isObjectEqual(value1, value2, omitEmpty);
          if (!_flag) {
            flag = false;
            break;
          }
        } else if (
          typeofs === '[object Array]' &&
          typeofs2 === '[object Array]'
        ) {
          const _flag = isArrayEqual(value1, value2, omitEmpty);
          if (!_flag) {
            flag = false;
            break;
          }
        } else if (typeofs === typeofs2) {
          // string number boolean null undefined
          if (value1 !== value2) {
            flag = false;
            break;
          }
        } else {
          // 类型不同,不相等
          flag = false;
          break;
        }
      }

      i++;
    }
    return flag;
  } else {
    return false;
  }
};

/**
 * @description 判断两个数据是否相等
 * @param {any} data1
 * @param {any} data2
 * @param {boolean} omitEmpty 默认为false,当为true时,为空的值判断为相等
 * @return {boolean}
 */
export const isEqual = function (data1: any, data2: any, omitEmpty = false) {
  let flag = true;
  // 如果两个都为空,判断为相等
  if (omitEmpty && isEmpty(data1) && isEmpty(data2)) {
    // flag = true;
  } else {
    const typeofs = Object.prototype.toString.call(data1);
    const typeofs2 = Object.prototype.toString.call(data2);

    if (typeofs === '[object Object]' && typeofs2 === '[object Object]') {
      const _flag = isObjectEqual(data1, data2, omitEmpty);
      if (!_flag) {
        flag = false;
      }
    } else if (typeofs === '[object Array]' && typeofs2 === '[object Array]') {
      const _flag = isArrayEqual(data1, data2, omitEmpty);
      if (!_flag) {
        flag = false;
      }
    } else if (typeofs === typeofs2) {
      // string number boolean null undefined
      if (data1 !== data2) {
        flag = false;
      }
    } else {
      // 类型不同,不相等
      flag = false;
    }
  }

  return flag;
};

isBasicData

/**
 * @description 是否是基本数据类型
 * @param {any} data
 * @return {boolean}
 */
export function isBasicData(data: any) {
  const basicDataTypes = [
    '[object String]',
    '[object Number]',
    '[object Boolean]',
    '[object Null]',
    '[object Undefined]',
  ];
  const typeofs = Object.prototype.toString.call(data);

  return basicDataTypes.includes(typeofs);
}

getEnumMap

export function getEnumMap(list: any[], key = 'name') {
  const typeofs = Object.prototype.toString.call(list);
  const isArray = typeofs === '[object Array]';
  const newObj: any = {};
  if (isArray && list.length > 0) {
    for (const item of list) {
      newObj[item[key]] = item;
    }
  }
  return newObj;
}

getRandomInt

返回了一个在指定值之间的随机整数

/**
 * 返回了一个在指定值之间的随机整数
 * @param min 这个值不小于 min (如果 min 不是整数,则不小于 min 的向上取整数)
 * @param max 这个值小于(不等于)max
 * @returns [min ,max )
 */
export const getRandomInt = function (min: number, max: number) {
  min = Math.ceil(min);
  max = Math.floor(max);
  return Math.floor(Math.random() * (max - min)) + min; // 不含最大值,含最小值
};

getAngle

/**
 * 计算从x1y1到x2y2的直线,与水平线形成的夹角
 * 计算规则为顺时针从左侧0°到与该直线形成的夹角
 * @param {Object} x1
 * @param {Object} y1
 * @param {Object} x2
 * @param {Object} y2
 * @param {Boolean} toAngle 是否转换为角度值,默认false
 */
export const getAngle = function (
  x1: number,
  y1: number,
  x2: number,
  y2: number,
  toAngle = false
) {
  const x = x1 - x2;
  const y = y1 - y2;
  if (!x && !y) {
    return 0;
  }

  // 弧度 radian = 角度 * Math.PI / 180
  // 角度 angle = 弧度 * 180 / Math.PI

  let res;

  // 角度
  const angle = (180 + (Math.atan2(-y, -x) * 180) / Math.PI + 360) % 360;
  res = 360 - angle;

  if (!toAngle) {
    res = (res * Math.PI) / 180;
  }
  return res;
};

omitEmpty

去除对象中为空的属性值 返回一个新对象

import { isEmpty } from './isEmpty';

type IndexKey = string | number | symbol;
interface AnyObject {
  [propName: IndexKey]: any;
}

/**
 * @description 去除对象中为空的属性值 返回一个新对象
 * @param {AnyObject} data
 * @return 返回一个新对象
 */
export const omitEmpty = function (data: AnyObject) {
  const typeofs = Object.prototype.toString.call(data);
  if (typeofs === '[object Object]') {
    const obj: AnyObject = {};
    for (const key in data) {
      if (!isEmpty(data[key])) {
        obj[key] = data[key];
      }
    }
    return obj;
  } else {
    console.error(`Expect type [object Object], but get type ${typeofs}`);
    return data;
  }
};

Custom

useWhere

export function useWhere(
  columns: { wustOper: string; wustField: string }[] = [],
  value: any = {}
) {
  const newObj: any = {};

  for (const key in value) {
    let newValue = value[key];
    if (!isEmpty(newValue)) {
      const ta = columns.find((item) => item.wustField == key);
      if (ta) {
        const taOper = ta.wustOper;
        const newKey = key + '@' + taOper;
        if (taOper == 'like' || taOper == 'ilike') {
          newValue = '%' + <string>newValue + '%';
        }

        newObj[newKey] = newValue;
      }
    }
  }

  return newObj;
}

stringToArr(字符串转数组)

export const isArrEmpty = function (data: any) {
  if (isEmpty(data)) {
    return true;
  } else {
    if (data == 'None' || data == '[]' || data === '{}') {
      return true;
    } else {
      return false;
    }
  }
};

// 字符串转数组
export const stringToArr = function (data: any) {
  let res = [];
  if (!isArrEmpty(data)) {
    const typeofs = Object.prototype.toString.call(data);
    if (typeofs === '[object String]') {
      const start = data.slice(0, 1);
      const end = data.slice(-1);

      if ((start === '{' && end === '}') || (start === '[' && end === ']')) {
        res = JSON.parse(data);
      } else {
        console.warn('字符串' + '【' + data + '】' + '不能解析为数组');
        res.push(data);
      }
    } else {
      console.error('【' + data + '】' + '的数据类型不是字符串');
    }
  }

  return res;
};

arrToString(数组转字符串)

// 数组转字符串
export const arrToString = function (data: any) {
  let res = '';
  const typeofs = Object.prototype.toString.call(data);
  if (typeofs === '[object Array]') {
    if (!isEmpty(data)) {
      res = JSON.stringify(data);
    }
  } else {
    console.error('数据类型【' + typeofs + '】错误');
  }

  return res;
};

未完待续…

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值