前端常见工具函数

174 阅读3分钟

一、日期类工具函数

1、以当前日期为基准,获取前3天和后3天的共7天的日期、星期的函数

function getWeekDays() {
  let days: any = [];
  let days1: any = [];
  let date = new Date().getTime();
  // let date1 = new Date().getDay();
  for(let i = 0 ; i<=24 * 6; i += 24){
    let dateItem = new Date(date - i * 60 * 60 * 1000);
    let dateItem1 = new Date(date + i * 60 * 60 * 1000);
    let m = dateItem.getDay();
    let d = dateItem.getDate();
    let m1 = dateItem1.getDay();
    let d1 = dateItem1.getDate();
    let v = d;
    let a = m;
    let l = d1;
    let u = m1;
    days.push({v, a});
    days1.push({l, u});
  }
  days = days.slice(1, 4);
  days1 = days1.slice(0, 4);
  let day = [...days, ...days1]
  day[0] = day[2];
  day[2] = days[0];
  day.map(item => {
    if (item?.a === 1) {
      item.a = '一',
      item.week = 1
    } else if (item?.a === 2) {
      item.a = '二',
      item.week = 2
    } else if (item?.a === 3) {
      item.a = '三',
      item.week = 3
    } else if (item?.a === 4) {
      item.a = '四',
      item.week = 4
    } else if (item?.a === 5){
      item.a = '五',
      item.week = 5
    } else if (item?.a === 6){
      item.a = '六',
      item.week = 6
    } else if (item?.a === 0){
      item.a = '日',
      item.week = 0
    }
      else if (item?.u === 5) {
      item.u = '五'
      item.week = 5
    } else if (item?.u === 6) {
      item.u = '六'
      item.week = 6
    } else if (item?.u === 0) {
      item.u = '日'
      item.week = 0
    } else if (item?.u === 1) {
      item.u = '一'
      item.week = 1
    } else if (item?.u === 2) {
      item.u = '二'
      item.week = 2
    } else if (item?.u === 3) {
      item.u = '三'
      item.week = 3
    } else if (item?.u === 4) {
      item.u = '四'
      item.week = 4
    };
  })
  console.log('最近七天日期:',days, days1, day);
  return day;
}

2、以当前日期为基准,后七天的函数

import dayjs from "dayjs";
function getWeek(){
  const today = dayjs(`${new Date()}`).format('YYYY-MM-DD');
  const after7days = dayjs().add(6, 'day').format('YYYY-MM-DD'); // 当前日期往后的一个星期时间
  // console.log(today, after7days);
  const weeks = formatEveryDay(today, after7days); // 获取起始和结束之间天数的所有日期和星期,具体见第三点函数
  // console.log(weeks);
  const newWeeks = weeks.map(week => ({
    l: parseInt(week.date.split("-")[2]),
    u: week.week.slice(2),
    week: uuid()
  }));

  // console.log(newWeeks, "newWeeks");
  return newWeeks;
}

3、获取起始和结束之间天数的所有日期和星期

// 输入的日期格式 "YYYY-MM-DD"
function formatEveryDay(start: string, end: string) {
  let weekArr = ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'];
  let dateList: any = [];
  let startTime = getDate(start);
  let endTime = getDate(end);

  while ((endTime.getTime() - startTime.getTime()) >= 0) {
    let year = startTime.getFullYear();
    let month = startTime.getMonth() + 1 < 10 ? '0' + (startTime.getMonth() + 1) : startTime.getMonth() + 1;
    let day = startTime.getDate().toString().length == 1 ? '0' + startTime.getDate() : startTime.getDate();
    // @ts-ignore
    let timeDay = startTime.getDay(startTime);
    dateList.push({
      date: year + '-' + month + '-' + day,
      text: month + '月' + day + '日',
      // @ts-ignore
      week: weekArr[startTime.getDay(startTime)],
      isWeekend: timeDay === 0 || timeDay === 6,
      detailList: []
    });
    startTime.setDate(startTime.getDate() + 1);
  }
  return dateList;
  // console.log(dateList, "dataList");
}

function getDate(datestr) {
  let temp = datestr.split('-');
  let date = new Date(temp[0], temp[1] - 1, temp[2]);
  return date;
}

4、日期大小的比较

// 入参格式"YYYY-MM-DD"
function capareTime(start: string, end: string){
  let startTime = start.replace(/-/g,'/');
  let endTime = end.replace(/-/g,'/');
  return Date.parse(startTime) - Date.parse(endTime); // 大于0表示在后面,小于0表示在前面
}

【拓展】:判断给定的日期是否在设定的日期范围内

// 判断target的日期是否在startTime和endTime之内,true表示在范围内,否则在范围外
function isBetweenStart2End(target: string, startTime: string, endTime: string){
  return capareTime(target, startTime) >= 0 && capareTime(target, endTime) <= 0;
}

5、计算两个日期【结束和开始日期】之间相差的天数

// 其中endDate表示结束的日期,startDate表示开始日期,格式"YYYY-MM-DD"
function getDiffDay(endDate: string, startDate: string) {
  let totalDays, diffDate;
  let myDate_1 = Date.parse(endDate) // 结束的日期
  let myDate_2 = Date.parse(startDate) // 开始的日期
  diffDate = myDate_1 - myDate_2; // 取相差毫秒数的绝对值
  totalDays = Math.floor(diffDate / (1000 * 3600 * 24)) // 向下取整
  // console.log(totalDays, "totalDays");
  return totalDays;    // 相差的天数
}

6、计算两个年份之间的所有年份

function getFullYear(startYear: number, endYear: number){
  const years: number[] = [];
  for (let i = 0; i <= endYear - startYear; i++){
    years.push(startYear + i);
  }
  years.reverse();
  return years;
}

7、计算来访的时间天数

/* 
 * beginTime和endTime分别表示来访的起始日期和结束日期,today表示当天的日期
 * 其中getDiffDay使用的是第5点计算相差天的函数
 */
const calcDays = (beginTime, endTime, today) => {
  // console.log(getDiffDay(beginTime, today), beginTime, today, "getDiffDay(beginTime, today)");
  if(beginTime && endTime){
    if(beginTime === endTime){
      return getDiffDay(beginTime, today) > 0? getDiffDay(beginTime, today) + "日后":
        getDiffDay(beginTime, today) === 0? "今天": "已过期";
    }else{
      if(getDiffDay(beginTime, today) >= 0){
        return getDiffDay(beginTime, today) > 0? getDiffDay(beginTime, today) + "日后": "今天";
      }else if(getDiffDay(beginTime, today) < 0 && getDiffDay(endTime, today) >= 0){
        return "来访中"
      }else if(getDiffDay(endTime, today) < 0){
        return "已过期"
      }
    }
  }
}

二、数组类工具函数

1、数组根据字段进行排序

// 根据字段keyName按照从大到小对对象数组进行排序
function sortObjectArray(objectArray, keyName){
  return objectArray.sort(function(val1, val2){
    if (!isNaN(Number(val1[keyName])) && !isNaN(Number(val2[keyName]))) {
      val1[keyName] = Number(val1[keyName]);
      val2[keyName] = Number(val2[keyName]);
    }
    if (val1[keyName] < val2[keyName]) {
      return 1;
    } else if (val1[keyName] > val2[keyName]) {
      return -1;
    } else {
      return 0;
    }
  });
}

2、将数组中元素按照null进行拆分【返回一个二维数组】

/**
 * 示例:输入:var a = [1, 2, 3, null, 2, null,null, 4],输出: [[1, 2, 3], [2], [4]]
 * @param array
 * @returns
 */
export function cutArrayByNull(array) {
  let result = []; // result
  for (let arr, i = 0; i < array.length; i++) {
    if (array[i] === null) {
      arr = null;
    } else {
      if (!arr) { // @ts-ignore
        result.push(arr = []);
      }
      arr.push(array[i]);
    }
  }
  // console.log(result, "bbbbbbb");
  return result;
}

3、对象数组去重根据属性去重,并按照日期从小到大排序,sortObjectArray是第一点函数

function ArrSet(Arr = [], id) {
  var obj = {};
  const arrays = Arr.reduce((setArr, item) => {
    // @ts-ignore
    obj[item[id]] ? '' : obj[item[id]] = true && setArr.push(item);
    return setArr;
  }, []);
  const array = sortObjectArray(arrays, "date");
  return array;
}

二、车牌号正则表达式验证

// 入参为车牌号,如:浙A56678
function isLegalVehicleNumber(vehicleNum: string) {
  const xreg=/^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z]{1}[A-Z]{1}(([0-9]{5}[ABCDEFGHJK]$)|([DF][A-HJ-NP-Z0-9][0-9]{4}$))/;  // 新能源
  const creg=/^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z]{1}[A-Z]{1}[A-HJ-NP-Z0-9]{4}[A-HJ-NP-Z0-9挂学警港澳]{1}$/; // 普通牌
  // const vehicleReg = /([京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领 A-Z]{1}[A-Z]{1}(([0-9]{5}[DF])|([DF]([A-HJ-NP-Z0-9])[0-9]{4})))|([京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领 A-Z]{1}[A-Z]{1}[A-HJ-NP-Z0-9]{4}[A-HJ-NP-Z0-9 挂学警港澳]{1})/;
  if (vehicleNum.length === 7){
    return creg.test(vehicleNum);
  }else if(vehicleNum.length === 8){
    return xreg.test(vehicleNum);
  }else{
    return false;
  }
}

三、金额大写转换

export function menoyToUppercase(money: any) {
  const cnNums = new Array(
    '零',
    '壹',
    '贰',
    '叁',
    '肆',
    '伍',
    '陆',
    '柒',
    '捌',
    '玖',
  ); //汉字的数字
  const cnIntRadice = new Array('', '拾', '佰', '仟'); //基本单位
  const cnIntUnits = new Array('', '万', '亿', '兆'); //对应整数部分扩展单位
  const cnDecUnits = new Array('角', '分', '毫', '厘'); //对应小数部分单位
  const cnInteger = '整'; //整数金额时后面跟的字符
  const cnIntLast = '元'; //整数完以后的单位
  //最大处理的数字
  const maxNum = 999999999999999.9999;
  const integerNum; //金额整数部分
  let decimalNum; //金额小数部分
  //输出的中文金额字符串
  let chineseStr = '';
  let parts; //分离金额后用的数组,预定义
  if (money == '') {
    return '';
  }

  money = parseFloat(money);
  if (money >= maxNum) {
    //超出最大处理数字
    return '超出最大处理数字';
  }
  if (money == 0) {
    chineseStr = cnNums[0] + cnIntLast + cnInteger;
    return chineseStr;
  }
  //四舍五入保留两位小数,转换为字符串
  money = Math.round(money * 100).toString();
  integerNum = money.substr(0, money.length - 2);
  decimalNum = money.substr(money.length - 2);
  //获取整型部分转换
  if (parseInt(integerNum, 10) > 0) {
    var zeroCount = 0;
    var IntLen = integerNum.length;
    for (var i = 0; i < IntLen; i++) {
      var n = integerNum.substr(i, 1);
      var p = IntLen - i - 1;
      var q = p / 4;
      var m = p % 4;
      if (n == '0') {
        zeroCount++;
      } else {
        if (zeroCount > 0) {
          chineseStr += cnNums[0];
        }
        //归零
        zeroCount = 0;
        chineseStr += cnNums[parseInt(n)] + cnIntRadice[m];
      }
      if (m == 0 && zeroCount < 4) {
        chineseStr += cnIntUnits[q];
      }
    }
    chineseStr += cnIntLast;
  }
  //小数部分
  if (decimalNum != '') {
    var decLen = decimalNum.length;
    for (var i = 0; i < decLen; i++) {
      var n = decimalNum.substr(i, 1);
      if (n != '0') {
        chineseStr += cnNums[Number(n)] + cnDecUnits[i];
      }
    }
  }
  if (chineseStr == '') {
    chineseStr += cnNums[0] + cnIntLast + cnInteger;
  } else if (decimalNum == '' || /^0*$/.test(decimalNum)) {
    chineseStr += cnInteger;
  }
  return chineseStr;
}