开发过程 常用数据转换 API

记录一下

数组及树形结构等数据装换操作方法

// 校验数据类型
export const checkDataType = (obj) => {
  return Object.prototype.toString.call(obj);
};

// 树结构获取值
// @输入参数 list: 需要扁平化的树形结构数组
// @输入参数 key 要查询的树形结构的下级字段 默认children
// @输出:返回别扁平化的数组
export const getTreeList = (list, key) => {
  let res = [];
  res = list.concat(
    ...list
      .map((item) => {
        if (item[key] instanceof Array && item[key].length > 0) {
          return getTreeList(item[key], key);
        }
        return null;
      })
      .filter((o) => o instanceof Array && o.length > 0)
  );
  return res;
};

// @输入参数 val: 要查找数据对应的数据
// @输入参数 list: 要查询的树形结构数组
// @输入参数 key 要查询的树形结构的字段值
// @输入参数 children 要查询的树形结构的下级字段 默认children
// @输出:返回该数据或null
export const findItemById = (val, list, key, children) => {
  let res = list.find((item) => item[key] == val);
  if (res) {
    return res;
  } else {
    for (let i = 0; i < list.length; i++) {
      if (list[i][children] instanceof Array && list[i][children].length > 0) {
        res = findItemById(val, list[i][children], key, children);
        if (res) {
          return res;
        }
      }
    }
    return null;
  }
};

// 查找元素的所有父级
// @输入参数 treeData 要查询的树形结构数组
// @输入参数 val: 要查找数据对应的数据
// @输入参数 key 要查询的树形结构的字段值
// @输入参数 children 要查询的树形结构的下级字段 默认children
// @输出:返回该数据或[]
export const findParents = (treeData, val, key, children) => {
  if (treeData.length == 0) return
  for (let i = 0; i < treeData.length; i++) {
    if (treeData[i][key] == val) {
      return []
    } else {
      if (treeData[i][children]) {
        let res = findParents(treeData[i][children], val, key, children)
        if (res !== undefined) {
          return res.concat(treeData[i])
        }
      }
    }
  }
}


// 一维数组转成tree
export const arrayToTree = (arr, pid, key, parkey) => {
  return arr.reduce((res, current) => {
    if (current[parkey] === pid) {
      let data = arrayToTree(arr, current[key], key, parkey);
      if (data.length) {
        current.children = data;
        current.childMenu = data;
      }
      return res.concat(current);
    }
    return res;
  }, []);
};

// 页面字体大小rem
export function FontSize() {
  (function (win, lib) {
    var doc = win.document;
    var docEl = doc.documentElement;
    var metaEl = doc.querySelector('meta[name="viewport"]');
    var flexibleEl = doc.querySelector('meta[name="flexible"]');
    var dpr = 0;
    var scale = 0;
    var tid;
    var flexible = lib.flexible || (lib.flexible = {});

    if (metaEl) {
      console.warn("将根据已有的meta标签来设置缩放比例");
      var match = metaEl.getAttribute("content").match(/initial\-scale=([\d\.]+)/);
      if (match) {
        scale = parseFloat(match[1]);
        dpr = parseInt(1 / scale);
      }
    } else if (flexibleEl) {
      var content = flexibleEl.getAttribute("content");
      if (content) {
        var initialDpr = content.match(/initial\-dpr=([\d\.]+)/);
        var maximumDpr = content.match(/maximum\-dpr=([\d\.]+)/);
        if (initialDpr) {
          dpr = parseFloat(initialDpr[1]);
          scale = parseFloat((1 / dpr).toFixed(2));
        }
        if (maximumDpr) {
          dpr = parseFloat(maximumDpr[1]);
          scale = parseFloat((1 / dpr).toFixed(2));
        }
      }
    }

    if (!dpr && !scale) {
      var isAndroid = win.navigator.appVersion.match(/android/gi);
      var isIPhone = win.navigator.appVersion.match(/iphone/gi);
      var devicePixelRatio = win.devicePixelRatio;
      if (isIPhone) {
        // iOS下,对于2和3的屏,用2倍的方案,其余的用1倍方案
        if (devicePixelRatio >= 3 && (!dpr || dpr >= 3)) {
          dpr = 3;
        } else if (devicePixelRatio >= 2 && (!dpr || dpr >= 2)) {
          dpr = 2;
        } else {
          dpr = 1;
        }
      } else {
        // 其他设备下,仍旧使用1倍的方案
        dpr = 1;
      }
      scale = 1 / dpr;
    }

    docEl.setAttribute("data-dpr", dpr);
    if (!metaEl) {
      metaEl = doc.createElement("meta");
      metaEl.setAttribute("name", "viewport");
      metaEl.setAttribute(
        "content",
        "initial-scale=" +
        scale +
        ", maximum-scale=" +
        scale +
        ", minimum-scale=" +
        scale +
        ", user-scalable=no"
      );
      if (docEl.firstElementChild) {
        docEl.firstElementChild.appendChild(metaEl);
      } else {
        var wrap = doc.createElement("div");
        wrap.appendChild(metaEl);
        doc.write(wrap.innerHTML);
      }
    }

    function refreshRem() {
      var width = docEl.getBoundingClientRect().width;
      if (width / dpr > 540) {
        width = width * dpr;
      }
      var rem = width / 100;
      rem >= 16 ? rem = 16 : rem
      docEl.style.fontSize = rem + "px";
      flexible.rem = win.rem = rem;
    }

    win.addEventListener(
      "resize",
      function () {
        clearTimeout(tid);
        tid = setTimeout(refreshRem, 300);
      },
      false
    );
    win.addEventListener(
      "pageshow",
      function (e) {
        if (e.persisted) {
          clearTimeout(tid);
          tid = setTimeout(refreshRem, 300);
        }
      },
      false
    );

    if (doc.readyState === "complete") {
      let rem = 12 * dpr
      rem >= 16 ? rem = 16 : rem
      doc.body.style.fontSize = rem + "px";
    } else {
      doc.addEventListener(
        "DOMContentLoaded",
        function (e) {
          let rem = 12 * dpr
          rem >= 16 ? rem = 16 : rem
          doc.body.style.fontSize = rem + "px";
        },
        false
      );
    }

    refreshRem();

    flexible.dpr = win.dpr = dpr;
    flexible.refreshRem = refreshRem;
    flexible.rem2px = function (d) {
      var val = parseFloat(d) * this.rem;
      if (typeof d === "string" && d.match(/rem$/)) {
        val += "px";
      }
      return val;
    };
    flexible.px2rem = function (d) {
      var val = parseFloat(d) / this.rem;
      if (typeof d === "string" && d.match(/px$/)) {
        val += "rem";
      }
      return val;
    };
  })(window, window["lib"] || (window["lib"] = {}));
}


/**
 * 数值 小于10 加 0   table序号使用
 */
export const NumberAdd0 = (num) => {
  let nums = num + 1
  return nums < 10 ? '0' + nums : nums
}

/**
 * 求出两数组中不同的元素
 */
export const findDifferenceItem = (curArr, oldArr) => {
  return curArr.concat(oldArr).filter(function (v, i, arr) {
    return arr.indexOf(v) === arr.lastIndexOf(v);
  });
}


/** * 大数字转换,将大额数字转换为万、千万、亿等 * @param value 数字值 */
export const bigNumberTransform = (values) => {
  let value = 0
  if (values) {
    value = values * 1 * 10000
  }
  const newValue = ['', '', '']
  let fr = 1000
  let num = 3
  let text1 = ''
  let fm = 1
  while (value / fr >= 1) {
    fr *= 10
    num += 1
  }
  if (num <= 4) { // 千
    newValue[0] = parseInt(value / 1000) + ''
    newValue[1] = '千'
  } else if (num <= 8) { // 万
    text1 = parseInt(num - 4) / 3 > 1 ? '千万' : '万'
    // tslint:disable-next-line:no-shadowed-variable
    fm = text1 === '万' ? 10000 : 10000000
    if (value % fm === 0) {
      newValue[0] = parseInt(value / fm) + ''
    } else {
      newValue[0] = parseFloat(value / fm).toFixed(2) + ''
    }
    newValue[1] = text1
  } else if (num <= 16) { // 亿
    text1 = (num - 8) / 3 > 1 ? '千亿' : '亿'
    text1 = (num - 8) / 4 > 1 ? '万亿' : text1
    text1 = (num - 8) / 7 > 1 ? '千万亿' : text1
    // tslint:disable-next-line:no-shadowed-variable
    fm = 1
    if (text1 === '亿') {
      fm = 100000000
    } else if (text1 === '千亿') {
      fm = 100000000000
    } else if (text1 === '万亿') {
      fm = 1000000000000
    } else if (text1 === '千万亿') {
      fm = 1000000000000000
    }
    if (value % fm === 0) {
      newValue[0] = parseInt(value / fm) + ''
    } else {
      newValue[0] = parseFloat(value / fm).toFixed(2) + ''
    }
    newValue[1] = text1
  }
  if (value < 1000) {
    newValue[0] = value + ''
    newValue[1] = ''
  }
  return newValue
}

// 数值转换万单位
export const bigNumberTransformS = (value) => {
  if (value == 0) {
    return [0, ""]
  } else {
    let newValue = [(value * 1).toFixed(2), "万"]
    return newValue
  }
}

// 数据取小数两位
export const twoshu = (num) => {
  if (num) {
    return Number(num.toString().match(/^\d+(?:\.\d{0,2})?/));
  } else {
    return 0
  }
}

// 数据判断置为 '-'
export const NumberTransform = (value) => {
  if (value == 0) {
    return value
  } else {
    if (value) {
      return (value * 1).toFixed(2)
    } else {
      return "-"
    }
  }
}

/**
  *下载导出文件
  * @param blob  :返回数据的blob对象或链接
  * @param tagFileName  :下载后文件名标记
  * @param fileType  :文件类 word(docx) excel(xlsx) ppt等
  */
export const downloadExportFile = (blob, tagFileName, fileType) => {
  let downloadElement = document.createElement('a');
  let href = blob;
  if (typeof blob == 'string') {
    downloadElement.target = '_blank';
  } else {
    href = window.URL.createObjectURL(blob); //创建下载的链接
  }
  downloadElement.href = href;
  downloadElement.download = tagFileName + moment(new Date().getTime()).format('YYYYMMDDhhmmss') + '.' + fileType; //下载后文件名
  document.body.appendChild(downloadElement);
  downloadElement.click(); //点击下载
  document.body.removeChild(downloadElement); //下载完成移除元素
  if (typeof blob != 'string') {
    window.URL.revokeObjectURL(href); //释放掉blob对象
  }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值