首页 > 技术文章 > tool.js日常工具方法

harlem 2020-05-08 13:18 原文

// 基础公共方法

/**
 * 将数据转化成数组 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
    }, [])
}

  

推荐阅读