工具函数🐠

56 阅读3分钟

本篇主要记录工作中一些实用的工具函数

1,根据身份证判断性别

getSex(idCard){
    if((parseInt(idCard.substr(161)) % 2 == 1)){
        return "1"; //男
    }else{
        return "2"; //女
    }
}

2,金额格式化

Fmoney(val) {
    val = val.toString().replace(/\$|\,/g, '');
    if (isNaN(val)) val = '0';
    const sign = (val == (val = Math.abs(val)));
    val = Math.floor(val * 100 + 0.50000000001);
    let cents = val % 100;
    val = Math.floor(val / 100).toString();
    if (cents < 10) cents = '0' + cents;
    for (let i = 0; i < Math.floor((val.length - (1 + i)) / 3); i++) {
        val = val.substring(0, val.length - (4 * i + 3)) + ',' + val.substring(val.length - (4 * i + 3));
    };
    return (((sign) ? '' : '-') + val + '.' + cents);
}
console.log(Fmoney(10000)); //10,000.00

3,打招呼/随机问候语

//打招呼
timeFix () {
  const time = new Date();
  const hour = time.getHours();
  return hour < 9 ? '早上好' : hour <= 11 ? '上午好' : hour <= 13 ? '中午好' : hour < 20 ? '下午好' : '晚上好';
}
console.log(timeFix()) //下午好
//随机问候语
welcome () {
  const arr = ['休息一会儿吧', '准备吃什么呢?', '要不要打一把 LOL', '我猜你可能累了'];
  const index = Math.floor(Math.random() * arr.length);
  return arr[index];
}
console.log(welcome()) //我猜你可能累了

4,将 url 请求参数转为 json 格式

/**
 * @description 将url请求参数转为json格式
 * @param url
 * @returns {{}|any}
 */
urlParam2Json(url) {
  const search = url.split('?')[1];
  if (!search) return {};
  return JSON.parse(
    '{"' +
      decodeURIComponent(search)
        .replace(/"/g, '\\"')
        .replace(/&/g, '","')
        .replace(/=/g, '":"')
        .replace(/\+/g, ' ') +
      '"}'
  )
}
console.log(paramObj("https://localhost:1102/detail?name=vue&id=1")) //{ "name": "vue", "id": "1" }

5,时间戳转换

/**
 * @description 10位时间戳转换
 * @param time
 * @returns {string}
 */
tenBitTimestamp(time) {
  const date = new Date(time * 1000)
  const y = date.getFullYear()
  let m = date.getMonth() + 1
  m = m < 10 ? '' + m : m
  let d = date.getDate()
  d = d < 10 ? '' + d : d
  let h = date.getHours()
  h = h < 10 ? '0' + h : h
  let minute = date.getMinutes()
  let second = date.getSeconds()
  minute = minute < 10 ? '0' + minute : minute
  second = second < 10 ? '0' + second : second
  return y + '年' + m + '月' + d + '日 ' + h + ':' + minute + ':' + second //组合
}
console.log(tenBitTimestamp(1303608600));//2011年4月24日 09:30:00
/**
 * @description 13位时间戳转换
 * @param time
 * @returns {string}
 */
thirteenBitTimestamp(time) {
  const date = new Date(time / 1)
  const y = date.getFullYear()
  let m = date.getMonth() + 1
  m = m < 10 ? '' + m : m
  let d = date.getDate()
  d = d < 10 ? '' + d : d
  let h = date.getHours()
  h = h < 10 ? '0' + h : h
  let minute = date.getMinutes()
  let second = date.getSeconds()
  minute = minute < 10 ? '0' + minute : minute
  second = second < 10 ? '0' + second : second
  return y + '年' + m + '月' + d + '日 ' + h + ':' + minute + ':' + second //组合
}
console.log(thirteenBitTimestamp(130360800600));//1974年2月18日 03:20:00

6,m 到 n 的随机数/随机颜色

/**
 * @description m到n的随机数
 * @param m
 * @param n
 * @returns {number}
 */
random(m, n) {
  return Math.floor(Math.random() * (m - n) + n)
}
console.log(random(1,10));//8(数字1到10之间的整数)

// 随机生成颜色
randomColor() {
  var r = Math.floor(Math.random() * 256);
  var g = Math.floor(Math.random() * 256);
  var b = Math.floor(Math.random() * 256);
  return "rgb(" + r + "," + g + "," + b + ")";
},

7,随机 id

/**
 * @description 获取随机id
 * @param length
 * @returns {string}
 */
uuid(length = 32) {
  const num = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890'
  let str = ''
  for (let i = 0; i < length; i++) {
    str += num.charAt(Math.floor(Math.random() * num.length))
  }
  return str
}
console.log(uuid());//12lwEZ7NShWOoZc8XiE6I3yEXXmpGHzq

8,打乱数组

/**
 * @description 数组打乱
 * @param array 需要打乱的数组
 * @returns {*}
 */
shuffle(array) {
  let m = array.length, t, i
  while (m) {
    i = Math.floor(Math.random() * m--)
    t = array[m]
    array[m] = array[i]
    array[i] = t
  }
  return array
}
console.log(shuffle([1,2,3,4,5]));//[2, 3, 1, 4, 5]

9,防抖与节流

// 防抖
debounce (callback,delay) {
  var t = null;
  return function () {
    clearTimeout(t);
    t = setTimeout(callback,delay);
  }
}
window.onscroll = debounce(function(){
  console.log("调用了一次");
},500)

//节流
throttle (callback,duration){
  var lastTime = new Date().getTime();
  return function () {
    var now = new Date().getTime();
    if(now - lastTime > duration){
      callback();
      lastTime = now;
    }
  }
}
window.onscroll = throttle(function(){
  console.log("调用了一次");
},500)

10,字符串对象转换为对象

const strParse = (str) =>
  JSON.parse(
    str.replace(/(\w+)\s*:/g, (_, p1) => `"${p1}":`).replace(/\'/g, '"')
  );

11,数字操作

//1,当你需要将小数点后的某些数字截断而不取四舍五入
const toFixed = (n, fixed) =>
  `${n}`.match(new RegExp(`^-?\\d+(?:\\.\\d{0,${fixed}})?`))[0];
toFixed(10.255, 2); // 10.25

//2,当你需要将小数点后的某些数字截断,并取四舍五入
const round = (n, decimals = 0) =>
  Number(`${Math.round(`${n}e${decimals}`)}e-${decimals}`);
round(10.255, 2); // 10.26

12,补 0

//当你需要在一个数字num不足len位数的时候前面补零操作
const replenishZero = (num, len, zero = 0) =>
  num.toString().padStart(len, zero);
replenishZero(8, 2); // 08

13,常用正则

1,校验手机号码:/^1[3-9]\d{9}$/
2,校验邮箱地址:/^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/
3,校验身份证号码:/^\d{17}[\dXx]$/
4,校验密码强度:/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)[a-zA-Z\d]{8,}$/
5,校验URL地址:/^((https?|ftp):\/\/)?([\da-z.-]+)\.([a-z.]{2,6})([\/\w.-]*)*\/?$/
6,校验日期格式:/^\d{4}-\d{2}-\d{2}$/
7,校验IP地址:/^((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)$/
8,校验开头,结尾空格:/^\S(.*\S)?$/i

14,纯前端验证码

<template>
  <div style="width: 100px; cursor: pointer">
    <canvas id="canvas" width="100%" height="36"></canvas>
  </div>
</template>

<script>
export default {
  mounted() {
    var show_num = [];
    this.draw(show_num);
  },
  methods: {
    // 验证码
    draw(show_num) {
      var pageCode = "";
      var canvas_width = document.querySelector("#canvas").width;
      var canvas_height = document.querySelector("#canvas").height;
      var canvas = document.getElementById("canvas");
      var context = canvas.getContext("2d");
      canvas.width = canvas_width;
      canvas.height = canvas_height;
      var sCode =
        "a,b,c,d,e,f,g,h,i,j,k,m,n,p,q,r,s,t,u,v,w,x,y,z,A,B,C,E,F,G,H,J,K,L,M,N,P,Q,R,S,T,W,X,Y,Z,1,2,3,4,5,6,7,8,9,0";
      var aCode = sCode.split(",");
      var aLength = aCode.length; //获取到数组的长度
      for (var i = 0; i < 4; i++) {
        var j = Math.floor(Math.random() * aLength); //获取到随机的索引值
        var deg = Math.random() - 0.5; //产生一个随机弧度
        var txt = aCode[j]; //得到随机的一个内容
        pageCode = pageCode + txt;
        show_num[i] = txt.toLowerCase();
        var x = 10 + i * 20; //文字在canvas上的x坐标
        var y = 20 + Math.random() * 8; //文字在canvas上的y坐标
        context.font = "bold 23px 微软雅黑";
        context.translate(x, y);
        context.rotate(deg);
        context.fillStyle = this.randomColor();
        context.fillText(txt, 0, 0);
        context.rotate(-deg);
        context.translate(-x, -y);
      }
      for (var i = 0; i <= 5; i++) {
        //验证码上显示线条
        context.strokeStyle = this.randomColor();
        context.beginPath();
        context.moveTo(
          Math.random() * canvas_width,
          Math.random() * canvas_height
        );
        context.lineTo(
          Math.random() * canvas_width,
          Math.random() * canvas_height
        );
        context.stroke();
      }
      for (var i = 0; i <= 30; i++) {
        //验证码上显示小点
        context.strokeStyle = this.randomColor();
        context.beginPath();
        var x = Math.random() * canvas_width;
        var y = Math.random() * canvas_height;
        context.moveTo(x, y);
        context.lineTo(x + 1, y + 1);
        context.stroke();
      }
    },
  }
}
<script>

15,深拷贝

deepClone(obj, hash = new WeakMap()) {
  if (obj instanceof RegExp) return new RegExp(obj);
  if (obj instanceof Date) return new Date(obj);
  if (obj === null || typeof obj !== "object") return obj;

  if (hash.has(obj)) return hash.get(obj);

  let t = new obj.constructor();
  hash.set(obj, t);

  for (let key in obj) {
    if (obj.hasOwnProperty(key)) {
      t[key] = this.deepClone(obj[key], hash);
    }
  }

  return t;
},

16,获得本周日期

function getThisWeekDates() {
  const today = new Date(); // 当前日期
  const dayOfWeek = today.getDay(); // 当前日期是周几,0 表示周日
  const oneDay = 1000 * 60 * 60 * 24; // 一天的毫秒数

  // 计算本周周一的日期
  const startOfWeek = new Date(
    today.getTime() - (dayOfWeek === 0 ? 6 : dayOfWeek - 1) * oneDay
  );
  // 计算本周周日的日期
  const endOfWeek = new Date(startOfWeek.getTime() + 6 * oneDay);

  // 格式化日期
  const formatDateString = (date) => {
    const year = date.getFullYear();
    const month = String(date.getMonth() + 1).padStart(2, "0"); // 月份从 0 开始,所以需要 +1
    const day = String(date.getDate()).padStart(2, "0");
    return `${year}${month}${day}日`;
  };

  return `${formatDateString(startOfWeek)}${formatDateString(endOfWeek)}`;
}
console.log(getThisWeekDates()); //2025年03月03日—2025年03月09日

17,根据输入判断密码强度

<script>
export default {
  watch: {
    password: {
      handler(newVal, oldVal) {
        // 1. 初步校验:长度不足 6 位直接判定为弱
        if (newVal.length < 6) {
          this.strengthLevel = "弱";
          return;
        }
        // 2. 检查字符类型
        const hasLower = /[a-z]/.test(newVal); // 小写字母
        const hasUpper = /[A-Z]/.test(newVal); // 大写字母
        const hasNumber = /\d/.test(newVal); // 数字
        const typeCount = [hasLower, hasUpper, hasNumber].filter(
          Boolean
        ).length;

        // 3. 根据类型数量判断强度
        if (typeCount === 3) {
          this.strengthLevel = "强"; // 包含小写字母、大写字母和数字
        } else if (typeCount === 2) {
          this.strengthLevel = "中"; // 包含小写字母,大写字母,数字其中两个
        } else {
          this.strengthLevel = "弱"; // 仅包含小写字母或大写字母或数字
        }
      },
    },
  },
};
</script>

18,复制到剪切板

/**
 * 复制到剪切板
 * @param {*} value 值
 * @param {*} cb 回调函数
 */
function copyClipboard(value, cb) {
  if (navigator.clipboard && window.isSecureContext) {
    navigator.clipboard.writeText(value).then(() => {});
  } else {
    let textarea = document.createElement("textarea");
    textarea.readOnly = "readonly";
    textarea.style.position = "absolute";
    textarea.style.left = "-9999px";
    textarea.value = value;
    document.body.appendChild(textarea);
    textarea.select();
    textarea.setSelectionRange(0, textarea.value.length);
    document.execCommand("Copy");
    document.body.removeChild(textarea);
  }

  if (cb && Object.prototype.toString.call(cb) === "[object Function]") {
    cb();
  }
}