项目中常用的工具函数(二)

上一篇:项目中常用的工具函数(一)

1、文本超出中间省略

/**
 * 通用 - 超过5个字符中间用 ... 代替
 * 处理前:大床房单间    处理后: 大床...间
 * @param  str 处理前-字符串
 * @param  num 数量
 * @return str 处理后-字符串
 */
export const commStringOmit = (str,num) => {
  if(str.length > num) {
    return str.substr(0, num - 2) + "..." + str.substr(-1);
  }
  return str;
}

2、相同的值,放到同一个数组里面

/**
 * @函数描述: 相同的str,放到同一个数组里面
 * @param: {Array} array 原数组
 * @param: {String} str 相同的值
 * @return: {Array} integration
 **/
export const sortArr = (array, str) => {
  var arrList = [], textList = [], tmp;
  // 按照特定的参数将数组排序将具有相同值得排在一起
  array = array.sort(function(a, b) {
    var aStr = a[str], bStr = b[str];
    return aStr < bStr ? -1 : 1;
  });
  if(array.length) {
    tmp = array[0][str];
  }
  // 将相同类别的对象添加到统一个数组
  for(var i in array) {
    if(array[i][str] === tmp) {
      textList.push(array[i]);
    } else {
      tmp = array[i][str];
      arrList.push(textList);
      textList = [array[i]];
    }
  }
  // 将最后的内容推出新数组
  arrList.push(textList); //获取到所有整合数据
  // 终极整合
  var integration = [];
  arrList.forEach((item) => {
    var itemObj = {title: "", children: []};
    item.forEach((self) => {
      // 后端返回的结构只有这几个字段,其他的不用传到父组件,否则会匹配不上,造成后端数据与传递数据项不统一
      if(itemObj.title !== self[str]) {
        itemObj.title = self[str];
        itemObj.children.push(self);
      } else {
        itemObj.children.push(self);
      }
    });
    if(itemObj.title !== ''){
      integration.push(itemObj);
    }
  });
  return integration;
}

3、数组去重

/**
 * @函数描述: 数组去重
 * @param: {Array} arr 原数组
 **/
export const arrayReduce = (data) => {
  return data.reduce((pre, cur) => {
    pre.indexOf(cur) === -1 && pre.push(cur);
    return pre;
  }, []);
}

To:常见的数组去重

 4、是否含有图片

/**
 * 判断是否含有图片
 * @param  str
 */
export const containsImgTag = (str) => {
  var pattern = /<img.*?>/ig;
  return pattern.test(str);
}

5、过滤图片 保留纯文本

/**
 * 过滤图片 保留纯文本
 * @param  str
 * @return
 */
export const filterImgTags = (str) => {
  return str.replace(/<img\b[^>]*?>/gi, " ")
}

6、过滤文本 保留纯图片

/**
 * 过滤文本 保留纯图片
 * @param  str base64地址
 * @param  reqData oss指令凭证
 * @return Array
 */
export const filterTextSaveImgSrc = (str,reqData) =>{
  let regex = /<img src="(.*?)"/g
  let matches = str.match(regex);
  let srcArr = []
  matches.forEach(item => {
    let srcData = item.split('"')[1]
    let base64ToImageStr = base64ToImage(srcData,reqData)
    srcArr.push(base64ToImageStr)
  })
  return srcArr
}

7、OSS直传并获取地址(base64转图片)

/**
 * base64转图片
 * @param  base64DataUrl base64地址
 * @param  OSSTokenData 获取oss指令凭证  后端配置生成(可几秒失效),前端不用去阿里云配置
 * @param  filename 图片的类型名称
 * @return oss图片地址
 */
export const OSSAndBase64ToImage = (base64DataUrl,OSSTokenData,filename) => {
  let arr = base64DataUrl.split(',')
  let mime = arr[0].match(/:(.*?);/)[1]
  let suffix = mime.split('/')[1]
  let bstr = atob(arr[1])
  let n = bstr.length
  let u8arr = new Uint8Array(n)
  while (n--) {
    u8arr[n] = bstr.charCodeAt(n)
  }
  let file =  new File([u8arr], `${filename}.${suffix}`, {
    type: mime,
  })

  let formKey = OSSTokenData.dir + randomString(12) + `-${file.name}`
  let formData = new FormData();
  formData.append('OSSAccessKeyId', OSSTokenData.accessid)
  formData.append('policy', OSSTokenData.policy)
  formData.append('Signature', OSSTokenData.signature)
  formData.append('key', formKey)
  formData.append('host', OSSTokenData.host)
  formData.append('dir', OSSTokenData.dir)
  formData.append("file", file);

  const xhr = new XMLHttpRequest();

  xhr.open('post', OSSTokenData.host);

  xhr.send(formData);
  return ossUrl + formKey
}

 注:这个要根据项目中的需求,自己配置formDate传递的数据

8、tree组件去掉undefined

/**
 * 去除外层多余的父节点的选中值 undefined  =>  分层选中的数据含有title的,但不需要这个数据,
 * 主要用于tree组件父节点没key,去掉父节点的选中值 undefined
 * @param {array}  checkedUserIdList  选中的userId集合
 * @param {string} removeValue     当前元素等于要删除的值
 */
export const removeParentNode = (checkedUserIdList, removeValue) => {
  for(var i = 0; i < checkedUserIdList.length; i++) {
    if(checkedUserIdList[i] === removeValue) {
      checkedUserIdList.splice(i, 1);
    }
  }
  return checkedUserIdList
}

9、tree获取所有子项

/**
 * @函数描述: 获取tree全部的key值集合
 * @param: {Array} data
 **/
export const getAllKeys = (data,name) => {
  let keys = [];
  for (let node of data) {
    if(node[name]){
      keys.push(node[name]);
    }
    if (node.children) {
      keys.push(...getAllKeys(node.children));
    }
  }
  return keys;
}

/**
 * @函数描述: 获取tree全部的value值集合
 * @param: {Array} data
 **/
 export const getAllNodes = (data) => {
    let nodes = [];
    for (let node of data) {
      if (node.userId) {
        nodes.push(node);
      }
      if (node.children) {
        nodes.push(...this.getAllNodes(node.children));
      }
    }
    return nodes;
 },

10、模糊搜索下拉框精确匹配文字高亮(v-html

/**
 * @函数描述: 模糊搜索下拉框精确匹配文字高亮
 * @param {object} content 下拉项的内容
 * @param {object} title 需要匹配的内容
 */
export const searchHeightLight = (content,title) =>{
  let reg = ''
  let dataToReplace  = `<span style="color: #02A7F0">${title}</span>`
  if (content.indexOf(title) !== -1) {
    reg = content.replace(title, dataToReplace);
  }else {
    reg = content;
  }
  return reg
}

11、获取url地址参数(对象

export const getParams() => {
	let url = location.search;
	let params = {};
	if(url.indexOf("?") === 0) {
		let strs = url.substr(1).replace(/\?/g, '&').split("&");
		for(let i = 0; i < strs.length; i++) {
			let kv = strs[i].split("=");
			params[kv[0]] = kv[1];
		}
	}
	return params;
}

 12、开启h5调节模式

/**
 * 开启h5调试模式
 */
function debug() {
	let src = 'https://cdn.jsdelivr.net/npm/eruda';
	document.write('<scr' + 'ipt src="' + src + '"></scr' + 'ipt>');
	document.write('<scr' + 'ipt>eruda.init();</scr' + 'ipt>');
}

13、全屏切换(兼容浏览器

/**
 * 全屏切换
 */
function toggleFullscreen() {
	if(document.fullscreenElement ||
		document.mozFullScreenElement ||
		document.webkitFullscreenElement ||
		document.msFullscreenElement) {
		if(document.exitFullscreen) {
			document.exitFullscreen();
		} else if(document.mozCancelFullScreen) {
			document.mozCancelFullScreen();
		} else if(document.webkitExitFullscreen) {
			document.webkitExitFullscreen();
		} else if(document.msExitFullscreen) {
			document.msExitFullscreen();
		}
	} else {
		if(document.documentElement.requestFullscreen) {
			document.documentElement.requestFullscreen();
		} else if(document.documentElement.mozRequestFullScreen) {
			document.documentElement.mozRequestFullScreen();
		} else if(document.documentElement.webkitRequestFullscreen) {
			document.documentElement.webkitRequestFullscreen(Element.ALLOW_KEYBOARD_INPUT);
		} else if(document.body.msRequestFullscreen) {
			document.body.msRequestFullscreen();
		}
	}
}

14、获取图片地址

/**
 * @函数描述: 获取图片的地址
 * @param: {String} url url地址
 **/
function getImage(url) {
    fetch(url).then(function(response) {
        if (!response.ok) {
            throw new Error('网络响应不成功');
        }
        return response.blob();
    }).then(function(myBlob) {
        let objectURL = URL.createObjectURL(myBlob);
        console.log(objectURL);
        window.open(objectURL);
    }).catch(function(error) {
        console.log('有问题出现在你的 fetch 操作中: ', error.message);
    });
}

/**
 * @函数描述: 获取图片的地址
 * @param: {String} url url地址
 **/
function getImage(url) {
	fetch(url, {mode: "no-cors"}).then(function(response) {
		console.log(response);
		return response.blob();
		//throw new Error('网络响应不成功');
	}).then(function(myBlob) {
		let objectURL = URL.createObjectURL(myBlob);
		console.log(objectURL);
		window.open(objectURL);
	}).catch(function(error) {
        console.log('有问题出现在你的 fetch 操作中: ', error.message);
	});
}

 15、字符串与base64互转

/**
 * 字符串转base64
 * @param str
 * @returns {string}
 */
function encodeBase64(str) {
	// 对字符串进行编码
	let encode = encodeURI(str);
	// 对编码的字符串转化base64
	return btoa(encode);
}

/**
 * base64转字符串
 * @param base64
 * @returns {string}
 */
function decodeBase64(base64) {
	// 对base64转编码
	let decode = atob(base64);
	// 编码转字符串
	return decodeURI(decode);
}

16、防止重复点击

let forbidRepeatClick = (function() {
	let instance = null;
	let canClick = true;

	function Build() {
		this.setClick = function(callback) {
			if(canClick) {
				canClick = false;
				callback()
				setTimeout(function() {
					canClick = true;
				}, 1000)
			} else {
				console.log('1s之内不能重复点击')
			}
		}
	}


	if(!instance) {
		instance = new Build();
	}

	return instance;
})()

17、防抖、节流、延迟

/**
 * @函数描述: 防抖
 **/
export const debounce(func, delay) => {
  let timeoutId;
  return function() {
    clearTimeout(timeoutId);
    timeoutId = setTimeout(() => {
      func.apply(this, arguments);
    }, delay);
  };
}

/**
 * @函数描述: 节流
 **/
export const throttle(func, delay) => {
  let timeoutId;
  return function() {
    if (!timeoutId) {
      timeoutId = setTimeout(() => {
        func.apply(this, arguments);
        timeoutId = null;
      }, delay);
    }
  };
}

/**
 * @函数描述: 让代码延迟执行
 * @param: {Number} numberMillis 睡眠的时间
 **/
function sleep(numberMillis) {
	var now = new Date();
	var exitTime = now.getTime() + numberMillis;
	while (true) {
		now = new Date();
		if (now.getTime() > exitTime)
			return;
	}
}

 下一篇:项目中常用的工具函数(三)

  • 12
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值