Util.js JavaScript帮助类

2022-03-23  本文已影响0人  wwmin_

项目中用到的一些JavaScript帮助类

import {  APP_NAME_EN} from '../../service/config/config'
import math from 'mathjs'

//必传参数函数
export function errorFunction(error = "必须传入参数") {
  throw new Error(error);
}

//延迟方法
export function timeout(delay) {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      try {
        resolve(1)
      } catch (e) {
        reject(0)
      }
    }, delay);
  })
}

//去除数组中空null等
export function arrayRejectNull(arr = []) {
  let arrayNullNum = [];
  arr.forEach((p, index) => {
    if (p === null || p.toString().trim() === "" || p === undefined || (typeof p === "number" ? isNaN(p) : false)) {
      arrayNullNum.push(index)
    }
  });
  arrayNullNum.reverse().forEach(n => {
    arr.splice(n, 1)
  });
  return arr;
}

//格式化时间 型为: 2017-01-01 09:10:02
export function formatTime(date) {
  if (!date) return "";
  if (typeof date === "string") date = date.replace("T", " "); //服务器返回的时间中含有T,部分浏览器解释不正确
  date = new Date(date);
  let year = date.getFullYear();
  let month = date.getMonth() + 1;
  let day = date.getDate();
  let hour = date.getHours();
  let minute = date.getMinutes();
  let second = date.getSeconds();
  return [year, month, day].map(formatNumber).join('-') + ' ' + [hour, minute, second].map(formatNumber).join(':')
}

//格式化时间 型为: 2017-01-01
export function formatDate(date) {
  if (!date) return "";
  if (typeof date === "string") date = date.replace("T", " "); //服务器返回的时间中含有T,部分浏览器解释不正确
  date = new Date(date);
  let year = date.getFullYear();
  let month = date.getMonth() + 1;
  let day = date.getDate();
  return [year, month, day].map(formatNumber).join('-')
}

//根据月份判断季度
export function getQuarterFromMonth(month) {
  if (!month || month < 0 || month > 12) {
    month = (new Date()).getMonth() + 1;
  }
  if (month > 0 && month <= 3) return {
    zh: "一季度",
    en: 1
  };
  if (month > 3 && month <= 6) return {
    zh: "二季度",
    en: 2
  };
  if (month > 6 && month <= 9) return {
    zh: "三季度",
    en: 3
  };
  if (month > 9 && month <= 12) return {
    zh: "四季度",
    en: 4
  };
}

//将个位数补上0
function formatNumber(n) {
  n = n.toString();
  return n[1] ? n : '0' + n
}

//格式化时间 型为: 2017年1月1日 9点10分
export function formatZhTime(date) {
  if (!date) return "";
  if (typeof date === "string") date = date.replace("T", " ");
  date = new Date(date);
  let year = date.getFullYear();
  let month = date.getMonth() + 1;
  let day = date.getDate();
  let hour = date.getHours();
  let minute = date.getMinutes();
  return `${year}年${month}月${day}日 ${hour}点${minute}分`
}

//格式化时间 型为: 2017年1月1日
export function formatZhDate(date) {
  if (!date) return "";
  if (typeof date === "string") date = date.replace("T", " ");
  date = new Date(date);
  let year = date.getFullYear();
  let month = date.getMonth() + 1;
  let day = date.getDate();
  return `${year}年${month}月${day}日`
}

//时间差
export function distinctTime(start, end) {
  let pastTime = (Date.parse(new Date(end)) - Date.parse(new Date(start))) / 1000; //转成时间戳
  let hours = parseInt(pastTime / (60 * 60));
  let minutes = parseInt((pastTime - hours * 60 * 60) / 60);
  let time;
  if (hours < 1) {
    time = `${minutes}分钟`
  } else if (minutes === 0) {
    time = `${hours}小时`
  } else {
    time = `${hours}小时${minutes}分钟`
  }
  return time
}

//ISO8601转RFC2822
export function ISO2RFC(date) {
  //date形如 2017-06-18T13:00:00 应将T去掉并且将'-' 替换为'/' 才能使所有的浏览器解析一致
  let newDate = date.toString();
  return newDate.replace('T', ' ').replace(/-/g, '/');
}

//获取某月天数
export function getMonthDay(date) {
  let mdate = new Date(new Date(date).toLocaleDateString());
  mdate.setDate(32); //自动减去当月的天数
  return 32 - mdate.getDate() //date.getDate()会返回一个减去当月天数的值 剩余值就是当月天数
}

//本周的开端日期
export function getWeekStartDate(date) {
  let now = date || new Date(); //当前日期
  let nowDayOfWeek = now.getDay() === 0 ? 7 : now.getDay(); //今天本周的第几天
  let nowDay = now.getDate(); //当前日
  let nowMonth = now.getMonth(); //当前月
  let nowYear = now.getFullYear(); //当前年
  let weekStartDate = new Date(nowYear, nowMonth, nowDay - nowDayOfWeek + 1);
  return formatDate(weekStartDate);
}

//本周的停止日期
export function getWeekEndDate(date) {
  let now = date || new Date(); //当前日期
  let nowDayOfWeek = now.getDay() === 0 ? 7 : now.getDay(); //今天本周的第几天
  let nowDay = now.getDate(); //当前日
  let nowMonth = now.getMonth(); //当前月
  let nowYear = now.getFullYear(); //当前年
  let weekEndDate = new Date(nowYear, nowMonth, nowDay + (7 - nowDayOfWeek));
  return formatDate(weekEndDate);
}

//桩号显示为小数  如:k200+110 => 200.110
export function formatStakeNumber(value = "") {
  return parseFloat(value.replace('+', '.').replace(/k/ig, '')).toFixed(3);
}

//小数转桩号  如:200.110 => k200+110
export function numberToStake(value) {
  if (!value) return '';
  let floatNum = parseFloat(value);
  if (isNaN(floatNum)) return '';
  let num = (parseFloat(value).toFixed(3) + '').split(".");
  return "K" + num[0] + "+" + num[1];
}

//将0换成空字符
export function zeroToEmpty(value) {
  if ((value + '').trim() === "0" || (value + '').trim() === "") return "";
  return value
}

//store names
export const storeNames = {
  'system_login': APP_NAME_EN + 'jcfjzhglglxt_dl','
};
/**
 * 存储localStorage
 */
export const setStore = (name, content) => {
  if (!name) return;
  if (typeof content !== 'string') {
    content = JSON.stringify(content)
  }
  window.localStorage.setItem(name, content)
};
/**
 * 获取localStorage
 */
export const getStore = name => {
  if (!name) return;
  return window.localStorage.getItem(name)
};
/**
 * 删除localStorage
 */
export const removeStore = name => {
  if (!name) return;
  window.localStorage.removeItem(name)
};
/**
 * 存储localSessionStorage
 */
export const setSessionStore = (name, content) => {
  if (!name) return;
  if (typeof content !== 'string') {
    content = JSON.stringify(content)
  }
  window.sessionStorage.setItem(name, content)
};
/**
 * 获取localSessionStorage
 */
export const getSessionStore = name => {
  if (!name) return;
  return window.sessionStorage.getItem(name)
};
/**
 * 删除localSessionStorage
 */
export const removeSessionStore = name => {
  if (!name) return;
  window.sessionStorage.removeItem(name)
};
/*
 * 对象浅拷贝 数组和对象
 * */
export const copy = object => {
  if (Object.prototype.toString.call(object) === '[object Array]') return object.slice();
  let o = {};
  for (let item in object) {
    if (object.hasOwnProperty(item)) o[item] = object[item];
  }
  return o;
};
/*
 * 对象深拷贝
 * */
export const copyDeep = function (obj) {
  let str, newobj = obj.constructor === Array ? [] : {};
  if (typeof obj !== 'object') {
    return;
  } else if (window.JSON) {
    str = JSON.stringify(obj), //序列化对象
      newobj = JSON.parse(str); //还原
  } else {
    for (let i in obj) {
      newobj[i] = typeof obj[i] === 'object' ?
        copyDeep(obj[i]) : obj[i];
    }
  }
  return newobj;
};
/*
 * 取小数点整位数
 * */
export const getNumWithFloat = f => {
  return f.toString().replace(/(\d+)\.(\d*)/, "$1");
};
/*
 * 取小数点后小数位
 * */
export const getDecimalWithFloat = f => {
  return f.toString().replace(/\d+\.(\d*)/, "$1");
};
/**
 * 给定数字和长度,不足位数自动补零
 */
export const prefixInteger = (num, length) => {
  return (Array(length).join('0') + num).slice(-length);
};
/**
 * 不足为补0,超出则舍去后面的值
 */
export const stakePrefix = (num, length = 3) => {
  if ((num + '').length >= length) {
    return (num + '').slice(0, length);
  }
  return prefixInteger(num, length);
};

/**
 * 如果有小数部分,保留n位小数
 **/
export function remainDecimal(float, n = 0) {
  if (float === null || float === undefined || float === "") return "";
  let numStrings = (float + '').split('.');
  if (numStrings.length === 2) {
    return math.round(parseFloat(float), n);
  } else {
    return math.round(float)
  }
}

/**
 * base64 加密解密
 * var result = base.encode("123");
 * var result2 = base.decode(result);
 */
export const Base64 = {
  // private property
  _keyStr: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=',
  // public method for encoding
  encode(input) {
    if (!input) return;
    let output = '';
    let chr1, chr2, chr3, enc1, enc2, enc3, enc4;
    let i = 0;
    input = this._utf8_encode(input);
    while (i < input.length) {
      chr1 = input.charCodeAt(i++);
      chr2 = input.charCodeAt(i++);
      chr3 = input.charCodeAt(i++);
      enc1 = chr1 >> 2;
      enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
      enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
      enc4 = chr3 & 63;
      if (isNaN(chr2)) {
        enc3 = enc4 = 64
      } else if (isNaN(chr3)) {
        enc4 = 64
      }
      output = output +
        this._keyStr.charAt(enc1) + this._keyStr.charAt(enc2) +
        this._keyStr.charAt(enc3) + this._keyStr.charAt(enc4)
    }
    return output
  },
  // public method for decoding
  decode(input) {
    if (!input) return;
    let output = '';
    let chr1, chr2, chr3;
    let enc1, enc2, enc3, enc4;
    let i = 0;
    input = input.replace(/[^A-Za-z0-9\+\/\=]/g, '');
    while (i < input.length) {
      enc1 = this._keyStr.indexOf(input.charAt(i++));
      enc2 = this._keyStr.indexOf(input.charAt(i++));
      enc3 = this._keyStr.indexOf(input.charAt(i++));
      enc4 = this._keyStr.indexOf(input.charAt(i++));
      chr1 = (enc1 << 2) | (enc2 >> 4);
      chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
      chr3 = ((enc3 & 3) << 6) | enc4;
      output = output + String.fromCharCode(chr1);
      if (enc3 != 64) {
        output = output + String.fromCharCode(chr2)
      }
      if (enc4 != 64) {
        output = output + String.fromCharCode(chr3)
      }
    }
    output = this._utf8_decode(output);
    return output
  },
  // private method for UTF-8 encoding
  _utf8_encode(string) {
    string = string.replace(/\r\n/g, '\n');
    let utftext = '';
    for (let n = 0; n < string.length; n++) {
      let c = string.charCodeAt(n);
      if (c < 128) {
        utftext += String.fromCharCode(c)
      } else if ((c > 127) && (c < 2048)) {
        utftext += String.fromCharCode((c >> 6) | 192);
        utftext += String.fromCharCode((c & 63) | 128)
      } else {
        utftext += String.fromCharCode((c >> 12) | 224);
        utftext += String.fromCharCode(((c >> 6) & 63) | 128);
        utftext += String.fromCharCode((c & 63) | 128)
      }
    }
    return utftext
  },
  // private method for UTF-8 decoding
  _utf8_decode(utftext) {
    let string = '';
    let i = 0;
    let c = 0;
    let c1 = 0;
    let c2 = 0;
    let c3 = 0;
    while (i < utftext.length) {
      c = utftext.charCodeAt(i);
      if (c < 128) {
        string += String.fromCharCode(c);
        i++
      } else if ((c > 191) && (c < 224)) {
        c2 = utftext.charCodeAt(i + 1);
        string += String.fromCharCode(((c & 31) << 6) | (c2 & 63));
        i += 2
      } else {
        c2 = utftext.charCodeAt(i + 1);
        c3 = utftext.charCodeAt(i + 2);
        string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
        i += 3
      }
    }
    return string
  }
};
//动态加载css js 文件方法
export const dynamicLoading = {
  //监测是否已经加载过
  css: function (path) {
    if (!path || path.length === 0) {
      throw new Error('argument "path" is required !');
    }
    let head = document.getElementsByTagName('head')[0];
    let link = document.createElement('link');
    link.href = path;
    link.rel = 'stylesheet';
    link.type = 'text/css';
    head.appendChild(link);
  },
  js: function (path, async = false) {
    if (!path || path.length === 0) {
      throw new Error('argument "path" is required !');
    }
    return new Promise((resolve, reject) => {
      let head = document.getElementsByTagName('head')[0];
      let script = document.createElement('script');
      script.src = path;
      script.async = async;
      script.charset = 'utf-8';
      script.type = 'text/javascript';
      script.onload = () => {
        resolve();
      };
      script.onerror = () => {
        console.error(path + " is not loaded success.");
        reject(new Error(path + " is not loaded success."))
      };
      head.appendChild(script);
    })
  }
};

//验证电话号码
export function isPhoneNum(num) {
  return /^1[3|4|5|7|8|9][0-9]\d{8}$/.test(num)
}

//防抖
export function debounce(func, wait, immediate) {
  let timeout, args, context, timestamp, result
  const later = function () {
    // 据上一次触发时间间隔
    const last = +new Date() - timestamp
    // 上次被包装函数被调用时间间隔last小于设定时间间隔wait
    if (last < wait && last > 0) {
      timeout = setTimeout(later, wait - last)
    } else {
      timeout = null
      // 如果设定为immediate===true,因为开始边界已经调用过了此处无需调用
      if (!immediate) {
        result = func.apply(context, args)
        if (!timeout) context = args = null
      }
    }
  }
  return function (...args) {
    context = this
    timestamp = +new Date()
    const callNow = immediate && !timeout
    // 如果延时不存在,重新设定延时
    if (!timeout) timeout = setTimeout(later, wait)
    if (callNow) {
      result = func.apply(context, args)
      context = args = null
    }
    return result
  }
}

/**
 * js 实现 linq groupBy
 *
 * @param {*} array
 * @param {*} f =>item.name || f=>[item.name,item.Average]
 * @returns
 */
export function groupBy(array, f) {
  let groups = {};
  array.forEach(o => {
    let group = JSON.stringify(f(o));
    groups[group] = groups[group] || [];
    groups[group].push(o);
  });
  return Object.keys(groups).map(group => groups[group])
}
上一篇下一篇

猜你喜欢

热点阅读