@Bios
2018-12-10T08:44:10.000000Z
字数 11356
阅读 903
js
Array.prototype.distinct = function(){
var arr = this;
var len = this.length;
var result = [];
if (Set) { // Es6 语法
return Array.from(new Set(arr));
} else { // 循环比较,依次找出数组中独立的项
for (var i = 0; i < len; i++) {
for (var j = i + 1; j < len; j++){
if (arr[i] === arr[j]) { // 1 和 '1'
j = ++i;
}
}
result.push(arr[i]);
}
return result;
}
}
isIos () {
var u = navigator.userAgent;
if (u.indexOf('Android') > -1 || u.indexOf('Linux') > -1) {//安卓手机
// return "Android";
return false
} else if (u.indexOf('iPhone') > -1) {//苹果手机
// return "iPhone";
return true
} else if (u.indexOf('iPad') > -1) {//iPad
// return "iPad";
return false
} else if (u.indexOf('Windows Phone') > -1) {//winphone手机
// return "Windows Phone";
return false
}else{
return false
}
}
isPC () { //是否为PC端
var userAgentInfo = navigator.userAgent;
var Agents = ["Android", "iPhone",
"SymbianOS", "Windows Phone",
"iPad", "iPod"];
var flag = true;
for (var v = 0; v < Agents.length; v++) {
if (userAgentInfo.indexOf(Agents[v]) > 0) {
flag = false;
break;
}
}
return flag;
}
browserType(){
var userAgent = navigator.userAgent; //取得浏览器的userAgent字符串
var isOpera = userAgent.indexOf("Opera") > -1; //判断是否Opera浏览器
var isIE = userAgent.indexOf("compatible") > -1 && userAgent.indexOf("MSIE") > -1 && !isOpera; //判断是否IE浏览器
var isIE11 = userAgent.indexOf('Trident') > -1 && userAgent.indexOf("rv:11.0") > -1;
var isEdge = userAgent.indexOf("Edge") > -1 && !isIE; //判断是否IE的Edge浏览器
var isFF = userAgent.indexOf("Firefox") > -1; //判断是否Firefox浏览器
var isSafari = userAgent.indexOf("Safari") > -1 && userAgent.indexOf("Chrome") == -1; //判断是否Safari浏览器
var isChrome = userAgent.indexOf("Chrome") > -1 && userAgent.indexOf("Safari") > -1; //判断Chrome浏览器
if (isIE) {
var reIE = new RegExp("MSIE (\\d+\\.\\d+);");
reIE.test(userAgent);
var fIEVersion = parseFloat(RegExp["$1"]);
if(fIEVersion == 7) return "IE7"
else if(fIEVersion == 8) return "IE8";
else if(fIEVersion == 9) return "IE9";
else if(fIEVersion == 10) return "IE10";
else return "IE7以下"//IE版本过低
}
if (isIE11) return 'IE11';
if (isEdge) return "Edge";
if (isFF) return "FF";
if (isOpera) return "Opera";
if (isSafari) return "Safari";
if (isChrome) return "Chrome";
}
checkStr (str, type) {
switch (type) {
case 'phone': //手机号码
return /^1[3|4|5|6|7|8][0-9]{9}$/.test(str);
case 'tel': //座机
return /^(0\d{2,3}-\d{7,8})(-\d{1,4})?$/.test(str);
case 'card': //身份证
return /(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/.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号
return /^[1-9][0-9]{4,9}$/.test(str);
case 'email': //邮箱
return /^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$/.test(str);
case 'money': //金额(小数点2位)
return /^\d*(?:\.\d{0,2})?$/.test(str);
case 'URL': //网址
return /(http|ftp|https):\/\/[\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 '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 'number': //数字
return /^[0-9]$/.test(str);
case 'english': //英文
return /^[a-zA-Z]+$/.test(str);
case 'chinese': //中文
return /^[\u4E00-\u9FA5]+$/.test(str);
case 'lower': //小写
return /^[a-z]+$/.test(str);
case 'upper': //大写
return /^[A-Z]+$/.test(str);
case 'HTML': //HTML标记
return /<("[^"]*"|'[^']*'|[^'">])*>/.test(str);
default:
return true;
}
/**
* 本地存储
* @param {[type]} name [description]
* @param {[type]} data [description]
*/
setStorage(name, data){
let dataType = typeof data;
// json对象
if(dataType === 'object'){
window.localStorage.setItem(name, JSON.stringify(data));
}
// 基础类型
else if(['number','string','boolean'].indexOf(dataType) >= 0){
window.localStorage.setItem(name, data);
}
// 其他不支持的类型
else{
alert('该类型不能用于本地存储');
}
}
/**
* 取出本地存储
* @param {[type]} name [description]
* @return {[type]} [description]
*/
getStorage(name){
let data = window.localStorage.getItem(name);
if(data){
return JSON.parse(data);
}
else{
return '';
}
}
/**
* 删除本地存储
* @param {[type]} name [description]
* @return {[type]} [description]
*/
removeStorage(name){
window.localStorage.removeItem(name);
}
const delay = timeout => {
return new Promise((resolve, reject) => {
setTimeout(() => reject('请求超时!'), timeout * 1000)
})
}
/**
* http请求
* @param {[type]} options.url [请求地址]
* @param {String} options.method [请求方法]
* @param {Object} options.params [请求参数]
* @param {[type]} timeout} [超时时间]
* @return {[type]} [Promise]
*/
const httpReq = ({url,method = 'get',params = {}, timeout}) => {
const paramArr = [];
/**
* var obj = {'a':'123','b':'345'};
* console.log(Object.keys(obj)); //['a','b']
*/
if (Object.keys(params).length !== 0) {
for (const key in params) {
paramArr.push(`${key}=${params[key]}`);
}
}
const urlStr = `${url}?${paramArr.join('&')}`; // get请求url拼接
const body = paramArr.join('&'); // post请求body传参
let options = {};
options = {
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded;charset=utf-8',
},
body: body
}
if (method.toLowerCase() === 'get'){
if (timeout === undefined) {
return fetch(urlStr)
} else {
// Promise.race当数组中有一个promise返回则返回,其余的不再执行。如果超时了就不执行了
return Promise.race([fetch(urlStr), delay(timeout)])
}
} else if (method.toLowerCase() === 'post') {
if (timeout === undefined) {
return fetch(url,options)
} else {
return Promise.race([fetch(url,options), delay(timeout)])
}
} else {
return new Promise((resolve,reject) => {
resolve('不支持该请求!');
})
}
}
export { httpReq }
get请求参数的设置:
使用:
// import axios from "axios";
//这样写打包的时候就不用切换开发环境和线上环境地址了
// console.log(process.env.NODE_ENV) // 看config下面dev.env.js里面的NODE_ENV
// const baseURL = process.env.NODE_ENV == 'development'?'https://cnodejs.org/api/v1':'线上环境地址'
// export default axios.create({
// //urlbase
// baseURL,
// //查询axios配置,可以设置全局请求头,全局拦截器(请求/响应)
// });
// ---------------------------------------------------------------------
// https://www.cnblogs.com/libin-1/p/6607945.html
import axios from 'axios';
import { Message } from 'element-ui';
// import Vue from 'vue'
// import router from 'vue-router'
// Vue.use(router)
axios.defaults.timeout = 5000;
axios.defaults.baseURL ='https://cnodejs.org/api/v1';
//http request 拦截器
axios.interceptors.request.use(
config => {
//在发送请求之前做某事
// 有的请求需要token验证,token一般存cookie,他就拿到 统一给所有请求加上token字段
// const token = getCookie('名称');注意使用的时候需要引入cookie方法,推荐js-cookie
// console.log("请求之前")
// console.log(config)
config.headers = {
'Content-Type':'application/x-www-form-urlencoded'
}
// if(token){
// config.params = {'token':token}
// }
return config;
},
err => {
return Promise.reject(err);
}
);
//http response 拦截器
axios.interceptors.response.use(
response => {
//对响应数据做些事
// var responses = JSON.stringify(response);
// if(response.status == 200){
// // alert(123)
// }else if(response.status == 404){
// alert("找不到")
// }
// console.log(response)
//登录机制--在某个页面,有时候用户没有登录 导致 请求里面没有携带登录所需要的验证机制 所以会返回一些特殊的状态码 约定好的,拦截到这样的状态码 可以给跳转操作,a跳槽到c 并且传参数告诉c 是我a传过去的,这样你登录完了 得知 是a跳转过来的
// if(response.data.errCode == 2){
// router.push({
// path:"/HelloWorld",
// querry:{redirect:router.currentRoute.fullPath}//从哪个页面跳转
// })
// }
return response;
},
err => {
//请求错误时做些事
if (err && err.response) {
switch (err.response.status) {
case 400:
err.message = '请求出错'
break
case 401:
Message.warning({
message: '授权失败,请重新登录'
})
store.commit('LOGIN_OUT')
setTimeout(() => {
window.location.reload()
}, 1000)
return
case 403:
err.message = '拒绝访问'
break
case 404:
err.message = '请求错误,未找到该资源'
break
case 500:
err.message = '服务器端出错'
break
}
} else {
err.message = '连接服务器失败'
}
Message.error({
message: err.message
})
// return Promise.resolve(err);
return Promise.reject(err)
}
);
/*
* 封装get方法
* @param url
* @param data
* @returns {Promise}
*/
export function fetch(url,params={}){
return new Promise((resolve,reject) => {
axios.get(url,{
params:params
})
.then(response => {
resolve(response.data);
})
.catch(err => {
reject(err)
})
})
}
/*
* 封装post请求
* @param url
* @param data
* @returns {Promise}
*/
export function post(url,data = {}){
return new Promise((resolve,reject) => {
axios.post(url,data)
.then(response => {
resolve(response.data);
},err => {
reject(err)
})
})
}
/*
* 封装patch请求
* @param url
* @param data
* @returns {Promise}
*/
export function patch(url,data = {}){
return new Promise((resolve,reject) => {
axios.patch(url,data)
.then(response => {
resolve(response.data);
},err => {
reject(err)
})
})
}
/*
* 封装put请求
* @param url
* @param data
* @returns {Promise}
*/
export function put(url,data = {}){
return new Promise((resolve,reject) => {
axios.put(url,data)
.then(response => {
resolve(response.data);
},err => {
reject(err)
})
})
}
export default class ArrayUtils {
/**
* 更新数组,若item已存在则将其从数组中删除,若不存在则将其添加到数组
* **/
static updateArray(array,item){
for (var i = 0, len = array.length; i < len; i++) {
var temp = array[i];
if (item=== temp) {
array.splice(i, 1);
return;
}
}
array.push(item);
}
/**
* 判断两个数组的是否相等
* @return boolean true 数组长度相等且对应元素相等
* */
static isEqual(arr1,arr2){
if(!(arr1&&arr2))return false;
if(arr1.length!=arr2.length)return false;
for(let i=0,l=arr1.length;i<l;i++){
if (arr1[i]!=arr2[i])return false;
}
return true;
}
/**
* clone 数组
* @return Array 新的数组
* */
static clone(from){
if(!from)return [];
let newArray=[];
for(let i=0,l=from.length;i<l;i++){
newArray[i]=from[i];
}
return newArray;
}
/**
* 将数组中指定元素移除
* **/
static remove(array,item){
if (!array)return;
for(var i=0,l=array.length;i<l;i++){
if (item===array[i])array.splice(i,1);
}
}
}
Array.prototype.equals = function (array) {
// if the other array is a falsy value, return
if (!array)
return false;
// compare lengths - can save a lot of time
if (this.length != array.length)
return false;
for (var i = 0, l = this.length; i < l; i++) {
// Check if we have nested arrays
if (this[i] instanceof Array && array[i] instanceof Array) {
// recurse into the nested arrays
if (!this[i].equals(array[i]))
return false;
}
else if (this[i] != array[i]) {
// Warning - two different object instances will never be equal: {x:20} != {x:20}
return false;
}
}
return true;
}
function p(s) {
return s < 10 ? '0' + s: s;
}
//创建、格式化时间函数
var younger_time = function(time) {
var time = new Date(time);
var year = time.getFullYear();
var month = time.getMonth() + 1; // 月份是从0-11
var day = time.getDate();
//格式化时间
var str = year + '-' + p(month) + '-' + p(day);
//写入时间格式为 xxxx-xx-xx
console.log(str);
}
function timestampFormat( timestamp ) {
function zeroize( num ) {
return (String(num).length == 1 ? '0' : '') + num;
}
var curTimestamp = parseInt(new Date().getTime() / 1000); //当前时间戳
var timestampDiff = curTimestamp - timestamp; // 参数时间戳与当前时间戳相差秒数
var curDate = new Date( curTimestamp * 1000 ); // 当前时间日期对象
var tmDate = new Date( timestamp * 1000 ); // 参数时间戳转换成的日期对象
var Y = tmDate.getFullYear(), m = tmDate.getMonth() + 1, d = tmDate.getDate();
var H = tmDate.getHours(), i = tmDate.getMinutes(), s = tmDate.getSeconds();
if ( timestampDiff < 60 ) { // 一分钟以内
return "刚刚";
} else if( timestampDiff < 3600 ) { // 一小时前之内
return Math.floor( timestampDiff / 60 ) + "分钟前";
} else if ( curDate.getFullYear() == Y && curDate.getMonth()+1 == m && curDate.getDate() == d ) {
return '今天' + zeroize(H) + ':' + zeroize(i);
} else {
var newDate = new Date( (curTimestamp - 86400) * 1000 ); // 参数中的时间戳加一天转换成的日期对象
if ( newDate.getFullYear() == Y && newDate.getMonth()+1 == m && newDate.getDate() == d ) {
return '昨天' + zeroize(H) + ':' + zeroize(i);
} else if ( curDate.getFullYear() == Y ) {
return zeroize(m) + '月' + zeroize(d) + '日 ' + zeroize(H) + ':' + zeroize(i);
} else {
return Y + '年' + zeroize(m) + '月' + zeroize(d) + '日 ' + zeroize(H) + ':' + zeroize(i);
}
}
}
export default function(time) {
if (time == undefined) return ''
let hours = parseInt(time / (60 * 60)),
minutes = parseInt((time % (60 * 60)) / 60),
seconds = parseInt(time % 60)
return `${hours}小时${minutes}分钟${seconds}秒`
}
/**
* 回到顶部
* @return {[type]} [description]
*/
scrollTop(){
let timer = setInterval(() => {
let top = document.body.scrollTop || document.documentElement.scrollTop;
let speed = Math.ceil(top / 5);
document.body.scrollTop = top - speed;
if (top === 0) {
clearInterval(timer);
}
}, 20)
}
function loadImg(src){
let promise = new Promise(function (resolve, reject) {
let img = document.createElement('img')
img.onload = function () {
resolve(img)
}
img.onerror = function () {
reject('图片加载失败')
}
img.src = src
})
return promise
}
export function deepClone(source) {
if (!source && typeof source !== 'object') {
throw new Error('error arguments', 'shallowClone')
}
const targetObj = source.constructor === Array ? [] : {}
for (const keys in source) {
if (source.hasOwnProperty(keys)) {
if (source[keys] && typeof source[keys] === 'object') {
targetObj[keys] = source[keys].constructor === Array ? [] : {}
targetObj[keys] = deepClone(source[keys])
} else {
targetObj[keys] = source[keys]
}
}
}
return targetObj
}