// 基础公共方法 /** * 将数据转化成数组 eg: 1 => [1] / [1] => [1] * @param {Array} arr 数组或单个数据 */ export const toArray = arr => [].concat(arr); /** * 数组去重 * @param {Array} arr 要去重的数组 * @returns {Array} 去重后的数组 */ export function uniqueArr (arr) { if (arr && arr instanceof Array) { return new Array(...new Set(arr)); } return arr; } /** * 小于10的数字,前边加个0 * @param {Number} num 要转换的数字 * @returns {String} 转换后的数字 */ export function addZero (num) { return (num < 10 ? '0' : '') + num; } /** * 连字符转驼峰 * @param {String} data 要转换的数据 */ export function hyphenToHump (data) { if (typeof data === 'string') { return data.replace(/-(w)/g, (...args) => args[1].toUpperCase()); } return data; } /** * 驼峰转连字符 * @param {String} data 要转换的数据 */ export function humpToHyphen (data) { if (typeof data === 'string') { return data.replace(/([A-Z])/g, '-$1').toLowerCase(); } return data; } /** * 格式化时间 将 Date 转化为指定格式的String * @param {Date} date 要转换的数据 * @param {String} fmt 指定格式 默认为 'yyyy-MM-dd hh:mm:ss' */ export function formatDate (date = new Date(), fmt = 'yyyy-MM-dd hh:mm:ss') { const that = new Date(date); var o = { 'M+': that.getMonth() + 1, // 月份 'd+': that.getDate(), // 日 'h+': that.getHours(), // 小时 'm+': that.getMinutes(), // 分 's+': that.getSeconds(), // 秒 'q+': Math.floor((that.getMonth() + 3) / 3), // 季度 S: that.getMilliseconds() // 毫秒 }; if (/(y+)/.test(fmt)) { fmt = fmt.replace(RegExp.$1, (that.getFullYear() + '').substr(4 - RegExp.$1.length)); } for (var k in o) { if (new RegExp('(' + k + ')').test(fmt)) { fmt = fmt.replace(RegExp.$1, (RegExp.$1.length === 1) ? (o[k]) : (('00' + o[k]).substr(('' + o[k]).length))); } } return fmt; } /** * 每隔一段时间判断条件是否满足,条件满足时执行函数 * @param {Function} callFunc 条件满足时执行的函数 * @param {Function} condition 获取条件是否满足 默认为满足 * @param {Number} interval 时间间隔 单位毫秒 默认为 100ms */ export function delay (callFunc, condition = () => true, interval = 100) { const _delay = (callFunc, condition, interval) => { let TIMER = null; TIMER = setTimeout(() => { if (condition()) { clearTimeout(TIMER); callFunc(); } else { _delay(callFunc, condition, interval); } }, interval); }; if (condition()) { // 先判断是否满足条件 callFunc(); } else { _delay(callFunc, condition, interval); } } // 节流 export const throttle = (fn, delay = 500) => { let timer = null; return function () { clearTimeout(timer); timer = setTimeout(() => { fn.bind(this)(arguments); }, delay); }; }; /** * 安全的执行方法 * @param {Function} func 要执行的方法 * @param {...any} args 参数 * @returns {any} 成功执行的返回值 */ export function safeExecuteFunc (func, ...args) { if (typeof func === 'function') { try { return func(...args); } catch (err) { console.error(err); } } else { console.warn('func 不是可执行的方法!', func); } return undefined; } /** * 切换全屏显示状态 * @param {Boolean} bFullScreen 指定切换状态 */ export function toggleFullScreen (bFullScreen) { if (bFullScreen === undefined) { // 未指定则取反 bFullScreen = !(document.fullScreen || document.mozFullScreen || document.webkitIsFullScreen); } var el = document.documentElement; if (bFullScreen) { // 进入全屏,多重短路表达式 (el.requestFullscreen && el.requestFullscreen()) || (el.mozRequestFullScreen && el.mozRequestFullScreen()) || (el.webkitRequestFullscreen && el.webkitRequestFullscreen()) || (el.msRequestFullscreen && el.msRequestFullscreen()); } else { // 退出全屏 const exitFullscreen = document.exitFullscreen || document.mozCancelFullScreen || document.webkitExitFullscreen; exitFullscreen && exitFullscreen(); } return bFullScreen; } export function dataURLtoBlob (dataurl) { var arr = dataurl.split(','); var mime = arr[0].match(/:(.*?);/)[1]; var bstr = atob(arr[1]); var n = bstr.length; var u8arr = new Uint8Array(n); while (n--) { u8arr[n] = bstr.charCodeAt(n); } return new Blob([u8arr], { type: mime }); } /** * 查找当前属性值所在的对象 * @param {Array} data 被查找对象数据 * @param {String} findStr 查找属性名 * @param {String} curVal 查找的属性值 * @return {Object} */ export function recursionFunc(data, findStr, curVal) { let result = null; if (!data) { return } for (let i in data) { if (result !== null) { break } let item = data[i] if (item[findStr] == curVal) { result = item; break } else if (item.children && item.children.length > 0) { result = this.recursionFunc(item.children, curVal) } } return result } /** * 删除指定空值的属性 * @param {Array} data 查找属性名 * @param {Array} curKey 查找属性名 * @return {Array} */ export function handleRecur(data, curKey) { return data.reduce((iter, val) => { val[curKey].length ? val[curKey] = this.handleRecur(val[curKey]) : delete val[curKey]; iter.push(val); return iter }, []) }