常用工具方法总结

2020/05/15 JavaScript 本文共7053字,阅读全文约需24分钟 本文总阅读量

  常用工具方法总结。

千分位

export const comdify = (n) => {
  // 千分制
  n = '' + n;
  let isMinus = false;
  if (n.startsWith('-')) {
    isMinus = true;
    n = n.slice(1);
  }
  const re = /\d{1,3}(?=(\d{3})+$)/g;
  const n1 = n.replace(/^(\d+)((\.\d+)?)$/, function (s, s1, s2) {
    return s1.replace(re, '$&,') + s2;
  });
  return isMinus ? '-' + n1 : n1;
};

正则校验

// 常用正则验证
const checkStr = (str, type) => {
  switch (type) {
    case 'phone': //手机号码
      return /^1\d{10}$/.test(str);
    case 'tel': // 座机
      return /^(0\d{2,3}-\d{7,8})(-\d{1,4})?$/.test(str);
    case 'card': // 身份证
      return /^\d{15}|\d{18}$/.test(str);
    case 'pwd': // 密码以字母开头,长度在6~18之间,只能包含字母、数字和下划线
      return /^[a-zA-Z]\w{5,17}$/.test(str);
    case 'postal': // 邮政编码
      return /[1-9]\d{5}(?!\d)/.test(str);
    case 'QQ': // QQ号 5-11位数字
      return /^[1-9]\d{4,10}$/.test(str);
    case 'email': // 邮箱
      return /^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$/.test(str);
    case 'money': // 金额(小数点2位)
      return /^\d*(?:\.\d{0,2})?$/.test(str);
    case 'URL': // 网址
      return /(https?|ftp):\/\/[\w\-_]+(\.[\w\-_]+)+([\w\-\.,@?^=%&:/~\+#]*[\w\-\@?^=%&/~\+#])?/.test(
        str
      );
    case 'IP': // IP
      return /((?:(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d)\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d))/.test(
        str
      );
    case 'day': // 一个月的31天 01-09和1~31
      return /^((0?[1-9])|(([12])[0-9])|30|31)$/.test(str);
    case 'month': // 一年的12个月 01-09和1-12
      return /^(0?[1-9]|1[0-2])$/.test(str);
    case 'date': // 日期时间
      return (
        /^(\d{4})\-(\d{2})\-(\d{2}) (\d{2})(?:\:\d{2}|:(\d{2}):(\d{2}))$/.test(
          str
        ) || /^(\d{4})\-(\d{2})\-(\d{2})$/.test(str)
      );
    case 'poInteger': // 整数 正整数
      return /^\d+$/.test(str);
    case 'integer': // 整数 正整数或负整数
      return /^-?\d+$/.test(str);
    case 'decimal': // 小数
      return /^(-?\d+)(\.\d+)?$/.test(str);
    case 'english': // 英文
      return /^[a-zA-Z]+$/.test(str);
    case 'chinese': // 中文
      return /^[\u4E00-\u9FA5]+$/.test(str);
    case 'cname': // 中文姓名 2-4位汉字
      return /^[\u4E00-\u9FA5]{2,4}$/.test(str);
    case 'lower': // 小写
      return /^[a-z]+$/.test(str);
    case 'upper': // 大写
      return /^[A-Z]+$/.test(str);
    case 'HTML': // HTML标记
      return /<("[^"]*"|'[^']*'|[^'">])*>/.test(str);
    default:
      throw new Error('检验出错 in function checkStr');
  }
};

校验是否为中国大陆手机号

// 说明:现在已经出现了16开头的手机号,原正则`/^1[3,4,5,7,8][0-9]{9}$/`不再适用
function isTel(value) {
    return /^1[3,4,5,6,7,8,9][0-9]{9}$/.test(value.toString());
}

数据统计处理

// 去除字符串两边的空格 trim
String.prototype.trim = function() {
  return this.replace(/(^\s+)\|(\s+$)/g, '')
}
// 找出重复最多的字符
let str = 'asss23sjdssskssa7lsssdkjsssdss'
const repeatMost = (str) => {
const arr = str.split(/\s*/)              // 把字符串转换为数组
const str2 = arr.sort().join('')              // 首先进行排序,这样结果会把相同的字符放在一起,然后再转换为字符串
let value = ''
let index = 0
str2.replace(/(\w)\1*/g, function($0, $1) {         // 匹配字符
  if (index < $0.length) {
    index = $0.length              // index是出现次数
    value = $1                  // value是对应字符
  }
})
console.log(`最多的字符: ${value} ,重复的次数: ${index}`)
}
repeatMost(str)
// 数字格式化,1234567890 -> 1,234,567,890
const numFormat = str => str.replace(/\B(?=(\d{3})+(?!\d))/g, ',')
// 手机号中间四位换*
const validateMobile = str => /^[1][0-9]{10}$/.test(str) && str.replace(/(\d{3})(\d{4})(\d{4})/, (rs, $1, $2, $3) => `${$1}****${$3}`)
// 取URL中query到一个对象中
function getUrlParam(str) {
  const result = {}
  const valid = /(https?|ftp):\/\/[\w\-_]+(\.[\w\-_]+)+([\w\-\.,@?^=%&:/~\+#]*[\w\-\@?^=%&/~\+#])?/.exec(str)
  if (!valid) return
  const [rs, $1, $2, $3] = valid
  $3.match(/[a-zA-Z_]+=[^=&?]*/g).forEach(val => val.replace(/^(\w+)=(\w*)$/, ($0, $1, $2) => {
        result[$1] = $2
      })
  )
  return result
}
getUrlParam('https://www.baidu.com?name=jawil&age=23&d=')         // {name: "jawil", age: "23", d: ""}
// 验证是否是合法URL
function validateURL(textval) {
  const urlregex = /^(https?|ftp):\/\/([a-zA-Z0-9.-]+(:[a-zA-Z0-9.&%$-]+)*@)*((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}|([a-zA-Z0-9-]+\.)*[a-zA-Z0-9-]+\.(com|edu|gov|int|mil|net|org|biz|arpa|info|name|pro|aero|coop|museum|[a-zA-Z]{2}))(:[0-9]+)*(\/($|[a-zA-Z0-9.,?'\\+&%$#=~_-]+))*$/
  return urlregex.test(textval)
}
// HTML编码,对< / > " & \等字符转义,避免XSS攻击
function htmlEncode(str) {
  return str.replace(/[\<\>\"\'\&]/g, function(rs) {
    switch (rs) {
      case '<':
        return '&lt;'
      case '>':
        return '&gt;'
      case '&':
        return '&amp;'
      case ''':
        return '&apos;'
      case '"':
        return '&quot;'
    }
  })
}
// 批量写cookies
export const setCookieByBatch = (
  cookiesObj: {
    [key: string]: any;
  },
  days?: number
) => {
  let expires = 'Session';
  if (days) {
    const exp = new Date();
    exp.setTime(exp.getTime() + days * 86400000);
    expires = exp.toUTCString();
  }
  for (const key in cookiesObj) {
    // 同一个域内 cookie 是按名称来存储和检索的,不同名就不会出现被覆盖的情况
    // 使用escape编码,使用decodeURIComponent解码在中文情况下可能会报URI的错误
    document.cookie = `${key}=${encodeURIComponent(
      cookiesObj[key]
    )};expires=${expires}`;
  }
};

// 获取所有cookies
export const getAllCookie = () => {
  const cookies = document.cookie.split(/;\s*/);
  const jsonCookies = {};
  for (const item of cookies) {
    // 将每条数据以=号拆开
    const data = item.split('=');
    // 数组中的第一元素为属性名 第二一个为值【第二个为对象类型时,还需要继续decodeURIComponent,这里只做一层】
    jsonCookies[data[0]] = decodeURIComponent(data[1]);
  }
  return jsonCookies;
};

// 获取指定cookies
export const getCookie = (name: string) => {
  let arr;
  const reg = new RegExp(`(^| )${name}=([^;]*)(;|$)`);
  // eslint-disable-next-line no-cond-assign
  if ((arr = reg.exec(document.cookie))) {
    return decodeURIComponent(arr[2]);
  } else {
    return null;
  }
};

// 具体的删除cookie逻辑
const realDelCookie = (name: string, expires: any) => {
  const cval = getCookie(name);
  if (cval) {
    document.cookie = `${name}=${cval};expires=${expires.toUTCString()}`;
  }
};

/**
 * 删除cookie,支持批量
 * @param name
 */
export const delCookie = (name: string | string[]) => {
  const exp = new Date();
  exp.setTime(exp.getTime() - 1);
  if (Array.isArray(name)) {
    for (const item of name) {
      realDelCookie(item, exp);
    }
  } else {
    realDelCookie(name, exp);
  }
};

Storage 的 CRUD

const Store = {
  // 存储localstorage时候最好是封装一个自己的键值,在这个值里存储自己的内容对象,封装一个方法针对自己对象进行操作。避免冲突也会在开发中更方便。
  ns: 'letschat_web_storage',
  init: (ns = 'letschat_web_storage') => {
    const mydata = localStorage.getItem(ns);
    if (mydata) {
      return;
    }
    Store.ns = ns;
    localStorage.setItem(ns, '{"data":{}}');
  },
  // 检测浏览器是否支持localStorage
  check: () => {
    return Boolean(window.localStorage);
  },
  // 读取
  get: (key: string) => {
    let mydata = localStorage.getItem(Store.ns);
    if (!mydata) {
      return null;
    }
    mydata = JSON.parse(mydata);

    // @ts-expect-error
    return mydata.data[key];
  },
  // 存储
  set: (key: string, value: any) => {
    const { ns } = Store;
    let mydata = localStorage.getItem(Store.ns);
    if (!mydata) {
      Store.init();
      mydata = localStorage.getItem(ns);
    }
    mydata = JSON.parse(mydata as string);
    // @ts-expect-error
    mydata.data[key] = value;
    localStorage.setItem(ns, JSON.stringify(mydata));
  },
  remove: (key: string) => {
    // 读取
    let mydata = localStorage.getItem(Store.ns);
    if (!mydata) {
      return false;
    }

    mydata = JSON.parse(mydata);
    // @ts-expect-error
    mydata.data[key] = null;
    localStorage.setItem(Store.ns, JSON.stringify(mydata));
    return true;
  },
  clear: () => {
    // 清除对象
    localStorage.removeItem(Store.ns);
  },
  // 批量保存,data是一个字典
  setList: (data: { [key: string]: any }) => {
    for (const i in data) {
      Store.set(i, data[i]);
    }
  },
  // 批量删除,list是一个数组
  removeList: (list: string[]) => {
    for (let i = 0, len = list.length; i < len; i++) {
      Store.remove(list[i]);
    }
  },
};

删除 URL 中某个参数

// 删除url中某个参数
export const delUrlSearch = (name: string) => {
  let baseUrl = '';
  let url = location.href;
  if (url.includes('&')) {
    baseUrl = url.split('?')[0] + '?';
  } else {
    baseUrl = url.split('?')[0];
  }
  const query = url.split('?')[1];
  if (query?.includes(name)) {
    const obj = {};
    const arr: any = query.split('&');
    for (let i = 0; i < arr.length; i++) {
      const temp = arr[i].split('=');
      obj[temp[0]] = temp[1];
    }
    delete obj[name];
    url =
      baseUrl +
      JSON.stringify(obj)
        .replace(/[\"\{\}]/g, '')
        .replace(/\:/g, '=')
        .replace(/\,/g, '&');
  }
  window.history.pushState({}, '', url);
};

JS 活学活用正则表达式

前端常用工具方法

Search

    欢迎与我交流

    江南逰子

    Table of Contents