记录一些方法,防止忘掉

156 阅读5分钟

数组的转换

多数组转一维数组

export const flatten = arr =>
  arr.reduce(
    (acc, val) => acc.concat(Array.isArray(val) ? flatten(val) : val),
    []
  );

一维数组转二维数组

/**
 * 一维数组转二维数组
 * @param {*} arr 数组
 * @param {*} num 需要转换二维数组的长度
 */
export const oneTogether = (arr, num = 4) => {
  const len = arr.length;
  const lineNum = len % num === 0 ? len / num : Math.floor(len / num + 1);
  let newArray = [];
  for (let i = 0; i < lineNum; i++) {
    // slice() 方法返回一个从开始到结束(不包括结束)选择的数组的一部分浅拷贝到一个新数组对象。且原始数组不会被修改。
    const temp = arr.slice(i * num, i * num + num);
    newArray.push(temp);
  }
  return newArray;
};

数组去重

/**
 * 数组去重
 * @param {*} arr 数组
 */
export const arrayStore = arr => {
  const array = arr.sort();
  let newArray = [];
  for (let i = 0; i < array.length; i++) {
    for (let j = i + 1; j < array.length; j++) {
      if (array[i] === array[j]) ++i;
    }
    newArray.push(array[i]);
  }
  return newArray;
};

数组冒泡排序

/**
 * 数组冒泡排序
 * @param {*} arr 数组
 */
export const bubbleSort = arr => {
  const length = arr.length;
  if (length > 1) {
    //n个数的数组需要排序(n-1)轮
    for (let i = 0; i < length - 1; i++) {
      //每一轮比较的次数逐次递减
      for (let j = 0; j < length - 1 - i; j++) {
        let a = 0;
        if (arr[j] > arr[j + 1]) {
          a = arr[j];
          arr[j] = arr[j + 1];
          arr[j + 1] = a;
        }
      }
    }
  }
  return arr;
};

数组快速排序

/**
 * 数组快速排序
 * @param {数组} arr
 */
export const fastSort = arr => {
  const length = arr.length;
  if (length <= 1) return arr;

  //找到基准点并删除该数
  let index = Math.floor(length / 2);
  let base = arr.splice(index, 1)[0];
  let left = [];
  let right = [];
  //把数组按基准点分成两个子数组
  for (let i = 0; i < arr.length; i++) {
    let val = arr[i];
    if (val > base) {
      right.push(val);
    } else {
      left.push(val);
    }
  }
  //递归
  return quickSort(left).concat([base], quickSort(right));
};

常用的一些正则验证

用户名检测

// 用户名检测(4到16位(字母,数字,下划线,减号))
export const checkName = name => {
  const pattern = /^[a-zA-Z0-9_-]{4,16}$/;
  return pattern.test(name);
};

身份证检测

// 身份证号检测
export const checkIdCard = num => {
  const idCard = /^[1-9]\d{5}(18|19|([23]\d))\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$/;
  return idCard.test(num);
};

手机号检测

// 身份证号检测
export const checkIdCard = num => {
  const idCard = /^[1-9]\d{5}(18|19|([23]\d))\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$/;
  return idCard.test(num);
};

邮箱检测

// 邮箱检测
export const checkEmail = email => {
  const pattern = /^([A-Za-z0-9_\-\.])+\@([A-Za-z0-9_\-\.])+\.([A-Za-z]{2,4})$/;
  return pattern.test(email);
};

判断数据是否是Object类型

// 判断一数据是否是 Object 类型
export const isObject = object => Object.prototype.toString.call(object) === "[object Object]";

版本比较

/**
 * 本地版本 大于或等于 线上版本
 *
 * @param {*} localVersion 本地版本
 * @param {*} onlineVersion 线上版本
 * @results: 0、版本相同;1、本地版本大于线上版本;-1、线上版本大于本地版本
 */
export const judgeVersion = (localVersion, onlineVersion) => {
  if (localVersion === onlineVersion) return 0;
  const _localVersion = localVersion.split(".");
  const _onlineVersion = onlineVersion.split(".");
  const len = Math.min(_localVersion.length, _onlineVersion.length);
  for (let i = 0; i < len; i++) {
    if (parseInt(_localVersion[i], 10) > parseInt(_onlineVersion[i], 10))
      return 1;
    if (parseInt(_localVersion[i], 10) < parseInt(_onlineVersion[i], 10))
      return -1;
  }
  if (_localVersion.length > _onlineVersion.length) return 1;
  if (_localVersion.length < _onlineVersion.length) return -1;
  return 0;
};

一些处理时间的方法

获取当前Unix时间

/** 获取当前 Unix 时间戳
 * 获取当前时间戳
 * @returns {Number}
 */
export const getUnix = () => {
  return Math.round(+new Date() / 1000);
};

时间格式转时间戳

/**
 * 时间格式转时间戳
 */
export const timestamp = data => {
  // var stringTime = "2014-07-10 10:21:12";
  let timestamp2 = Date.parse(new Date(data));
  timestamp2 = timestamp2 / 1000;
  //2014-07-10 10:21:12的时间戳为:1404958872
  return timestamp2;
};

获取日期的前一个星期

//  数字补零
const formatNumber = num => `${num > 9 ? "" : "0"}${num}`;

/**
 * 转换 Date 对象
 * @param  {Date} date
 * @returns {Object}
 */
function standardizedDate(date) {
  const year = date.getFullYear();
  const month = date.getMonth() + 1;
  const day = date.getDate();
  const hour = date.getHours();
  const minute = date.getMinutes();

  return {
    year,
    month: formatNumber(month),
    day: formatNumber(day),
    hour: formatNumber(hour),
    minute: formatNumber(minute)
  };
}

/**
 * 获取给定日期的前一个星期的日期字对象
 * @param  {Date} nowDate
 * @returns {Object}
 */
export const getWeekDate = (nowDate = new Date()) => {
  let lastWeekStamp = nowDate.getTime() - 6 * 3600 * 24 * 1000;
  let lastWeekDate = new Date();
  lastWeekDate.setTime(lastWeekStamp);
  let stdNowDate = standardizedDate(nowDate);
  let stdLastWeekDate = standardizedDate(lastWeekDate);
  return {
    nowTime: stdNowDate.year + "-" + stdNowDate.month + "-" + stdNowDate.day,
    pastTime:
      stdLastWeekDate.year +
      "-" +
      stdLastWeekDate.month +
      "-" +
      stdLastWeekDate.day
  };
};

秒转时间

//  数字补零
const formatNumber = num => `${num > 9 ? "" : "0"}${num}`;

// 秒转时间
export const waitTimer = array => {
  if (!Array.isArray(array)) throw new TypeError("array必须为数组");
  
  return array.map(item => {
    let rest = item;
    const _hours = Math.floor(rest / 3600);
    const hours = formatNumber(_hours);
    rest = rest - _hours * 3600;
    const _minutes = Math.floor(rest / 60);
    const minutes = formatNumber(_minutes);
    rest = rest - _minutes * 60;
    const seconds = formatNumber(rest);
    return `${hours}:${minutes}:${seconds}`;
  });
};

获取距离当前时间的时间长度

/**
 * 获取距离当前时间的时间长度
 * @param  {Number} timestamp
 * @returns {String}
 */
function limeTime(timestamp) {
  let currentUnixTime = Math.round(new Date().getTime() / 1000);
  let deltaSecond = currentUnixTime - parseInt(timestamp, 10);
  let result;
  if (deltaSecond < 60) {
    result = deltaSecond + " 秒前";
  } else if (deltaSecond < 3600) {
    result = Math.floor(deltaSecond / 60) + " 分钟前";
  } else if (deltaSecond < 86400) {
    result = Math.floor(deltaSecond / 3600) + " 小时前";
  } else {
    result = Math.floor(deltaSecond / 86400) + " 天前";
  }
  return result;
}

判断时间是否为当天时间

/**
 * 判断是否为当天时间
 * @param {Number} str 时间戳
 */
export const isToday = str => {
  const time = String(str).length === 10 ? str * 1000 : str;
  if (new Date(time).toDateString() === new Date().toDateString()) {
    return true;
  } else if (new Date(str) < new Date()) {
    return false;
  }
};

时间戳转换时间格式

/**
 * 时间戳转化为年 月 日 时 分 秒
 * number: 传入时间戳
 * format:返回格式,支持自定义,但参数必须与formateArr里保持一致
 * 例子:formatDate(时间戳, 'M月D日 h:m:s')
 */
export const formatDate = (number, format) => {
  //  数字补零
  const formatNumber = num => `${num > 9 ? "" : "0"}${num}`;
  
  const formateArr = ["Y", "M", "D", "h", "m", "s", "年", "月", "日"];
  let returnArr = [];
  const date = new Date(number * 1000);
  returnArr.push(date.getFullYear());
  returnArr.push(formatNumber(date.getMonth() + 1));
  returnArr.push(formatNumber(date.getDate()));

  returnArr.push(formatNumber(date.getHours()));
  returnArr.push(formatNumber(date.getMinutes()));
  returnArr.push(formatNumber(date.getSeconds()));

  for (let i in returnArr) {
    format = format.replace(formateArr[i], returnArr[i]);
  }
  return format;
};

根据跟当前时间的时间长度返回中文时间字符串

/**
 * 根据跟当前时间的时间长度返回中文时间字符串
 * @param  {Date} date
 * @returns {String}
 */
export const dateToRelativeTime = date => {
  let DaySeconds = 86400; // const letiable, 24 hours * 60 mins * 60 s
  let currentDate = new Date();
  let currentMonth = currentDate.getMonth();
  let currentYear = currentDate.getFullYear();
  date = new Date(date);
  let year = date.getFullYear();
  let month = date.getMonth();
  let days = new Date().getDate() - date.getDate();
  let distanceMillis = currentDate.getTime() - date.getTime();
  let seconds = Math.floor(Math.abs(distanceMillis) / 1000);
  let minutes = Math.floor(seconds / 60);
  let result;
  // more than whole day
  if (seconds >= DaySeconds) {
    if (days == 1 && seconds < DaySeconds * 2) {
        // TODO: formatTime为上面时间戳转换方法
      result = "昨天 " + formatTime(date, "short");
    } else if (days == 2 && seconds < DaySeconds * 3) {
      result = "前天 " + formatTime(date, "short");
    } else if (year === currentYear) {
      result = formatTime(date, "withNoYear");
    } else {
      result = formatTime(date, "full");
    }
  }
  // more than one day but no whole day or in different month e.g. May or June,but days != 1 .
  else if (days == 1 || currentMonth != month) {
    // TODO: limeTime为上面获取距离当前时间的时间长度
    result = limeTime(date.getTime() / 1000);
  } else if (seconds >= 3600) {
    result = limeTime(date.getTime() / 1000);
  } else if (seconds >= 60) {
    result = minutes + " 分钟前";
  } else {
    result = "刚刚";
  }
  return result;
};

其他一些方法

数字转换每3位增加“,”处理

/**
 * 数字转换3位增加,处理
 * @param {*} str
 */
export const NumberUnitProcess = str => {
  return str
    .split("")
    .reverse()
    .reduce((prev, next, index) => {
      return (index % 3 ? next : next + ",") + prev;
    });
};

生成随机数

/**
 * 生成随机数
 * @param {最小值} minNum
 * @param {最大值} maxNum
 * @returns {Number} 随机数
 */
export const random = (minNum, maxNum) => {
  switch (arguments.length) {
    case 1:
      return parseInt(Math.random() * minNum + 1, 10);
    case 2:
      return parseInt(Math.random() * (maxNum - minNum + 1) + minNum, 10);
    default:
      return 0;
  }
};

js节流、防抖

// 节流
    let timer;
    function throttling () {
      clearTimeout(timer)
      timer = setTimeout(function () {
        console.log('节流')
      }, 500)
    }
    
// 防抖
   function antiShake () {
     let timer;
	 return function(){
	   if(timer) clearTimeout(timer);
	     timer = setTimeout(() => {
	       console.log('防抖')
	     }, 500)
	 }
    }  

meta标签设置

 <meta http-equiv="X-UA-Compatible" content="IE=edge">
 <meta name="viewport" content="width=device-width,initial-scale=1.0">
 <meta name="renderer" content="webkit" />
 <meta name="force-rendering" content="webkit" />
 <meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1" />