数组的转换
多数组转一维数组
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" />