最近工作整理的一些工具方法,分享出来
1. 数字分隔格式化处理
function addCount(formatArr, count, limit, split) {
if (count >= limit) return formatArr;
formatArr.splice(count, 0, " ");
addCount(formatArr, count + split, formatArr.length, split);
}
/** 数字分隔格式化处理
* str 数字串 例如 888888888888, 411322199007898787
* splitNum 分隔数 例如4
* firstSplitNum 首次分隔数(用于身份证) 6
* 返回 8888 8888 8888,411322 1990 0789 8787
*/
export function numFormat(str, splitNum, firstSplitNum?) {
let formatStr = String(str);
formatStr = formatStr.replace(/ /g, "");
const formatArr = formatStr.split("");
if (firstSplitNum) {
let count = firstSplitNum;
splitNum = splitNum + 1;
addCount(formatArr, count, formatArr.length, splitNum);
} else {
addCount(formatArr, splitNum, formatArr.length, splitNum + 1);
}
const resultStr = formatArr.toString();
return resultStr.replace(/,/g, "");
}
2.删除obg属性
/** 删除obg属性
* obg 对象 {name: '', sex: ''}
* keys 属性数组 ['name', 'sex']
*/
export function delObgKey(obg, keys) {
if (keys && Array.isArray(keys)) {
for (let i = 0; i < keys.length; i++) {
if (
obg &&
typeof obg === "object" &&
Object.prototype.hasOwnProperty.call(obg, keys[i])
) {
try {
delete obg[keys[i]];
} catch (err) {
console.log("delete error");
}
}
}
}
return obg;
}
3. 给金额添加逗号
/*
* 给金额添加逗号
* money:金额,字符串
*/
export const convertMoney = (money: string | number) => {
money = money.toString();
if (!money) {
return "--";
}
return amountFormat(money.replace(/(\d)(?=(\d{3})+(?:\.\d+)?$)/g, "$1,"));
};
4. 多层取值
/** 多层取值 getValueFromRoot(fundDetail, 'fundDetail.fundStatus.duration'); */
export const getValueFromRoot = (root, valueStr) => {
if (!(root && valueStr)) return "";
console.log("valueStr=======", valueStr);
if (valueStr.includes(".") >= 0) {
const valueArr = valueStr.split(".");
let resultValue = root;
for (let i = 1; i < valueArr.length; i++) {
if (checkNullData(resultValue[valueArr[i]])) {
resultValue = resultValue[valueArr[i]];
} else {
resultValue = "";
}
}
return resultValue;
}
return root;
};
6. 掩码
/**
* 掩码
* @param str 文本
* @param frontLen 前面保留位数
* @param endLen 后面保留位数
* @param isReverse 是否取反
*/
export const maskCodeHasReverse = (
str: string,
frontLen: number = 0,
endLen: number = 0,
isReverse: boolean = false
) => {
if (!str) {
return "";
}
const len = str.length - frontLen - endLen;
if (len <= 0) {
return str;
}
let symbol = "";
for (let i = 0; i < len; i++) {
symbol += "*";
}
if (isReverse) {
let symbolLeft = "";
let symbolRight = "";
for (let i = 0; i < frontLen; i++) {
symbolLeft += "*";
}
for (let i = 0; i < endLen; i++) {
symbolRight += "*";
}
return (
symbolLeft + str.substring(frontLen, str.length - endLen) + symbolRight
);
}
return (
str.substring(0, frontLen) + symbol + str.substring(str.length - endLen)
);
};
7. 截取小数点位数,无四舍五入
export const checkNullData = (value) => {
return !(value === null || value === undefined || value === "");
};
/** 截取小数点位数,无四舍五入, 判断值是否为null undefind '' */
export function formatDecimalcheckNull(num, decimal = 2) {
if (!checkNullData(num)) return num || 0;
num = num.toString();
let index = num.indexOf(".");
if (index !== -1) {
num = num.substring(0, decimal + index + 1);
} else {
num = num.substring(0);
}
return parseFloat(num).toFixed(decimal);
}
8. 数据字段替换
/**
* 数据转换,
* @params transForm [{oldField: 'lastGains', newField: 'rate'}, {oldField: '$riskLevel.name', newField: 'riskLevel'},]
* @params dataArr [{lastGains: '18', riskLavel:{ name: '中高风险'}}, { lastGains: '16',riskLavel:{ name: '低风险'} }]
* return data [{rate: '18', riskLavel: '中高风险'},{rate: '16', riskLavel: '低风险'}]
* 如果oldFeild 取值包含$,隔层取值,替换newField的值
*/
export const transData = (transForm, dataArr) => {
try {
for (let i = 0; i < transForm.length; i++) {
let transValue = "";
if (dataArr && Array.isArray(dataArr) && dataArr.length > 0) {
dataArr = dataArr.map((it, idx) => {
if (transForm[i].oldField.indexOf("$") >= 0) {
let newStrArr =
transForm[i].oldField.replace("$", "").split(".") || [];
transValue = getLengthData(it, newStrArr, newStrArr.length - 1, 0);
} else {
transValue =
it && getValueFromRoot(it, `it.${transForm[i].oldField}`);
}
it[transForm[i].newField] = transValue;
return it;
});
}
}
return dataArr;
} catch (err) {
console.log("err");
return [];
}
};
9. 日期格式化
/** 日期格式化 */
export const dateFormat = (
dateFrom: number | string,
format = "yyyy-MM-dd hh:mm:ss"
) => {
if (dateFrom === 0 || dateFrom === "") {
return "";
}
if (Object.prototype.toString.call(dateFrom) === "[object String]") {
dateFrom = dateFrom.toString().replace(/-/g, "/");
}
const date = new Date(dateFrom);
const o = {
"M+": date.getMonth() + 1, // 月份
"d+": date.getDate(), // 日
"h+": date.getHours(), // 小时
"m+": date.getMinutes(), // 分
"s+": date.getSeconds(), // 秒
"q+": Math.floor((date.getMonth() + 3) / 3), // 季度
S: date.getMilliseconds(), // 毫秒
};
if (/(y+)/.test(format)) {
format = format.replace(
RegExp.$1,
`${date.getFullYear()}`.substr(4 - RegExp.$1.length)
);
}
Object.keys(o).forEach((k) => {
if (new RegExp(`(${k})`).test(format)) {
format = format.replace(
RegExp.$1,
RegExp.$1.length === 1 ? o[k] : `00${o[k]}`.substr(`${o[k]}`.length)
);
}
});
return format;
};
10. url参数,对象转&
// url参数,对象转&
export const connectParams = (params, symbol = "&") => {
return Object.entries(params)
.filter((param) => param[1] !== "" && param[1] !== undefined)
.map((param) => `${param[0]}=${param[1]}`)
.join(symbol);
};
11. 比较两个日期大小
/** 比较两个日期大小
* startDate 2020-11-11
* endDate 2021-11-11
* type qe > re <
*/
export const checkDate = (startDate, endDate, type) => {
let status = false;
if (startDate.includes("-") && endDate.includes("-")) {
let sDate = startDate.split("-");
let eDate = endDate.split("-");
for (let i = 0; i < sDate.length; i++) {
if (type === "qe") {
if (Number(sDate[i]) > Number(eDate[i])) {
status = true;
break;
}
if (Number(sDate[i]) < Number(eDate[i])) {
status = false;
break;
}
} else if (type === "re") {
if (Number(sDate[i]) < Number(eDate[i])) {
status = true;
break;
}
if (Number(sDate[i]) > Number(eDate[i])) {
status = false;
break;
}
}
}
}
return status;
};
12 添加全局className
/** 添加全局className */
export const addClassNameToBody = (className) => {
const oBody = document.body;
const classnameArr = [oBody.className];
if (className && !classnameArr.includes(className)) {
classnameArr.push(className);
}
document.body.className = classnameArr.filter((item) => item).join(' ');
};
/** 删除全局className */
export const removeClassNameToBody = (className) => {
const oBody = document.body;
const classnameArr = (oBody.className && oBody.className.split(' ')) || [];
if (className) {
const _index = classnameArr.indexOf(className);
if (_index >= 0) {
classnameArr.splice(_index, 1);
}
// console.log('classnameArr _index', className, classnameArr, _index);
}
document.body.className = classnameArr.filter((item) => item).join(' ');
};
13. 去除对象里的空属性
export const checkNullData = (value) => {
return !(value === null || value === undefined || value === '');
};
/** 去除对象里的空属性 */
export function resetObjectNullProperty(obj) {
if (!(obj !== undefined && JSON.stringify(obj) !== '{}')) return obj;
let keys = Object.keys(obj);
let values = Object.values(obj);
let newObj = obj;
try {
for (let i = 0; i < keys.length; i++) {
if (!checkNullData(values[i])) {
newObj = delObgKey(obj, [keys[i]]);
}
}
} catch (err) {
console.log('resetObjectNullProperty err', err);
return obj;
}
return newObj;
}
14. 判断两个对象是否相等
/** 判断两个对象是否相等 */
export const isObjectValueEqual = (a, b) => {
var aProps = Object.getOwnPropertyNames(a);
var bProps = Object.getOwnPropertyNames(b);
if (aProps.length != bProps.length) {
return false;
}
for (var i = 0; i < aProps.length; i++) {
var propName = aProps[i];
var propA = a[propName];
var propB = b[propName];
// 故先判断两边都有相同键名
if (!b.hasOwnProperty(propName)) return false;
if (propA instanceof Object) {
if (isObjectValueEqual(propA, propB)) {
// return true
} else {
return false;
}
} else if (propA !== propB) {
return false;
} else {
}
}
return true;
};
15. 合并对象
export const assiginObj = (target = {}, sources = {}) => {
let obj = target;
if (typeof target != 'object' || typeof sources != 'object') {
return sources; // 如果其中一个不是对象 就返回sources
}
for (let key in sources) {
// 如果target也存在 那就再次合并
if (target.hasOwnProperty(key)) {
obj[key] = assiginObj(target[key], sources[key]);
} else {
// 不存在就直接添加
obj[key] = sources[key];
}
}
return obj;
};