记录一下
数组及树形结构等数据装换操作方法
// 校验数据类型
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对象
}
}