EngineUtils.js 6.5 KB
/**
 * Created by hoopoe8 on 2017/1/8.
 */
import Base64 from 'base64-js';
import UTF8 from 'utf-8';

class EngineUtils {
  static isEmptyObject(O) {
    for (var x in O) {
      return false;
    }
    return true;
  }

  static arrayToJsonString(_param) {
    try {
      return JSON.stringify(_param);
    } catch (err) {
      console.warn("数组转JSON失败->ERROR:" + err.message);
    }
    return "";
  }

  static arrayFromJsonString(_param) {
    try {
      return JSON.parse(_param);
    } catch (err) {
      console.warn("JSON转数组失败->ERROR:" + err.message);
    }
    return [];
  }

  /*
   * 生成随机数   _part 段数 默认3段;   splitStr分隔符
   * */
  static creatRandomNum(_part = 3, splitStr = "") {
    let randNumStr = "";
    for (let i = 0; i < _part; i++) {
      if(i==0){
        randNumStr += ""+parseInt(Math.random() * 1000);
      }else{
        randNumStr +=splitStr+parseInt(Math.random() * 1000);
      }
    }
    return randNumStr;
  }

  /*
   * 生成随机数   randomLen随机数范围;   minLen 随机数的最小长度
   * */
  static getRandomInt(randomLen, minLen) {
    let randNumStr = "";
    randNumStr=""+parseInt(Math.random() * randomLen);
    let distance=minLen-randNumStr.length;
    if(distance>0){
      for (let i = 0; i < distance; i++) {
        randNumStr="0"+randNumStr;
      }
    }
    return randNumStr;
  }


  //生成时间戳后9位 保证唯一
  static creatSoleNumberFromTimestamp() {
    let time = new Date().getTime();
    let timestamp = time % 1000000000;//time后9位
    return timestamp;
  }
  //生成时间戳毫秒
  static creatNowTime() {
    let time = new Date().getTime();
    return time;
  }
  //生成时间戳秒
  static creatTimestamp() {
    let time = parseInt(new Date().getTime() / 1000);//精确到秒
    return time;
  }

  //生成时间戳 string
  static creatTimestampStr() {
    let curTime = new Date();
    let timeStr = "" + curTime.getFullYear() + "-";
    timeStr += (curTime.getMonth() + 1) + "-";
    timeStr += curTime.getDate() + "-";
    timeStr += curTime.getHours() + "-";
    timeStr += curTime.getMinutes() + "-";
    timeStr += curTime.getSeconds();
    return timeStr;
  }

  //根据时间戳字符串转换为时间戳  2017-10-27-15-38-15
  static getTimestampFromStr(_timeStr) {
    if (!_timeStr) return this.creatTimestamp();
    let timeArr = _timeStr.split("_");
    if (timeArr && timeArr.length == 6) {
      return parseInt(new Date(timeArr[0], parseInt(timeArr[1]) - 1, timeArr[2], timeArr[3], timeArr[4], timeArr[5]).getTime() / 1000);
    }
    return this.creatTimestamp();
  }

  //生成时间戳  格式:"20170209"
  static creatTimestampYMD() {
    let curTime = new Date();
    let year = "" + curTime.getFullYear();
    let month = "" + (curTime.getMonth() + 1);
    let day = "" + curTime.getDate();

    if (month.length < 2) {
      month = "0" + month;
    }
    if (day.length < 2) {
      day = "0" + day;
    }
    return year + month + day;
  }

  static objectToBase64(_object) {
    try {
      let _objectStr = JSON.stringify(_object);
      //console.log("objectToBase64------1----------")
      let byte = UTF8.setBytesFromString(_objectStr);
      //console.log("objectToBase64------2----------")
      let _objectBase64 = Base64.fromByteArray(byte);
      return _objectBase64
    } catch (err) {
      console.log("objectToBase64 err:" + err.message);
      return "";
    }
    return ""
  }

  static objectFromBase64(_objectBase64) {
    try {
      let byte = Base64.toByteArray(_objectBase64);
      let _objectStr = UTF8.getStringFromBytes(byte);
      let _object = JSON.parse(_objectStr);
      return _object
    } catch (err) {
      console.log("objectFromBase64 err:" + err.message);
      return null;
    }
    return null;
  }

  //优化压缩坐标点数组,去除一些连续重复坐标的点,返回一个数组
  static compressPoint(_arr) {
    if (!_arr) {
      return [];
    }
    if (_arr.length < 5) {
      //点,直线,矩形 坐标点小于5不需要处理
      return _arr;
    }
    let tempPointArr = _arr;
    let newPointArr = [];
    newPointArr.push(tempPointArr[0]);
    let lastW = tempPointArr[0].w;
    let continueNum = 0;//坐标相同的连续次数
    //先筛除水平方向的连续重复坐标点
    let len = tempPointArr.length - 1;
    for (let i = 1; i < len; i++) {
      let item = tempPointArr[i];
      if (item && item.w != lastW) {
        lastW = item.w;
        if (continueNum > 0) {
          newPointArr.push(tempPointArr[i - 1]);
        }
        newPointArr.push(item);
        continueNum = 0;
      } else {
        continueNum++;
      }
    }
    //如果最终的坐标点数量小于2,需要把最后一个坐标点添加
    if (tempPointArr[len]) {
      newPointArr.push(tempPointArr[len]);
    }
    //如果坐标点已经小于等于2不需要继续检测
    if (newPointArr.length <= 2) {
      return newPointArr;
    }

    //筛除水垂直向的连续重复坐标点
    let finalPointArr = [];
    finalPointArr.push(newPointArr[0]);
    let lastH = newPointArr[0].h;
    continueNum = 0;
    len = newPointArr.length - 1;
    for (let k = 1; k < len; k++) {
      let item = newPointArr[k];
      if (item && item.h != lastH) {
        lastH = item.h;
        if (continueNum > 0) {
          finalPointArr.push(newPointArr[k - 1]);
        }
        finalPointArr.push(item);
        continueNum = 0;
      } else {
        continueNum++;
      }
    }
    if (newPointArr[len]) {
      finalPointArr.push(newPointArr[len]);
    }
    return finalPointArr;
  }

  //压缩数据,把坐标点数组转换为字符串,返回字符串
  static optimizePoint(_pointGroup) {
    if (!_pointGroup) {
      return "";
    }
    let tempStr = "";
    try {
      tempStr = JSON.stringify(_pointGroup);
    } catch (err) {
      return "";
    }
    let regexp1 = /},{"w":/g;
    let regexp2 = /,"h":/g;
    tempStr = tempStr.replace(regexp1, "#");
    tempStr = tempStr.replace(regexp2, "&");
    //console.log("标注压缩后的字符长度->",tempStr.length);
    return tempStr;
  }

  //把字符串坐标点集合转换为数组,返回数组的JSON
  static unPackOptimizePoint(_str) {
    if (!_str) {
      return "";
    }
    let tempStr = _str;
    let regexp1 = /#/g;
    let regexp2 = /&/g;
    tempStr = tempStr.replace(regexp1, '},{"w":');
    tempStr = tempStr.replace(regexp2, ',"h":');

    let dataArr = [];
    try {
      dataArr = JSON.parse(tempStr);
    } catch (err) {

    }
    return dataArr;
  }
}
export  default EngineUtils;