mm-utils
Version:
mm-utils,JavaScript工具包,日常开发工作常用的公共函数库
311 lines (294 loc) • 7.29 kB
JavaScript
// 基础处理库
/**
* 深复制
* @method deepClone
* @param {array} data - 源数据
* @returns {array}
*/
function deepClone(data) {
if (!data && typeof data !== "object") {
throw new Error("error arguments", "deepClone");
}
let targetObj = data.constructor === Array ? [] : {};
Object.keys(data).forEach((keys) => {
if (data[keys] && typeof data[keys] === "object") {
targetObj[keys] = deepClone(data[keys]);
} else {
targetObj[keys] = data[keys];
}
});
return targetObj;
}
/**
* 数组去重
* @method uniqArray
* @param {array} arr - 源数据
* @returns {array}
*/
function uniqArray(arr) {
const obj = {};
return arr.filter((item) => (obj[item.id] ? "" : (obj[item.id] = true)));
}
/**
* 通过索引字符串取值
* @method getObjectValue
* @param {object} obj - 源数据
* @param {string} key - 索引字符串
* @returns {any}
*/
function getObjectValue(obj, key) {
if (!isObject(obj)) {
return undefined;
}
let res = obj;
let keyArr = (key + "").split(".");
while (keyArr.length) {
if (!isObject(res)) {
return undefined;
}
res = res[keyArr.splice(0, 1)];
}
return res;
}
/**
* 通过props集合筛选对象。示例:objectFilter({a:100, b:200, c:300},['b','c']) return {b:200, c:300}
* @method objectFilter
* @param {object} obj - 源数据
* @param {array} props - 要返回的props集合
* @returns {object}
*/
function objectFilter(obj, props) {
let res = {};
for (let i in obj) {
props.includes(i) && (res[i] = obj[i]);
}
return res;
}
/**
* 判断对象是否为空
* @method isEmpty
* @param {object} obj - 源数据
* @returns {boolean}
*/
function isEmpty(obj) {
if (!obj && obj !== 0 && obj !== "") {
return true;
}
//检验数组
if (Array.prototype.isPrototypeOf(obj) && obj.length === 0) {
return true;
}
//检验对象
if (Object.prototype.isPrototypeOf(obj) && Object.keys(obj).length === 0) {
return true;
}
return false;
}
/**
* 判断是否为对象类型
* @method isObject
* @param {object} obj - 源数据
* @returns {boolean}
*/
function isObject(obj) {
return obj !== null && typeof obj === "object";
}
/**
* 判断是否为数组对象
* @method isArray
* @param {array} arr - 源数据
* @returns {boolean}
*/
function isArray(arr) {
if (typeof Array.isArray === "undefined") {
return Object.prototype.toString.call(arr) === "[object Array]";
}
return Array.isArray(arr);
}
/**
* 判断是否为undefined
* @method isUndefined
* @param {object} obj - 源数据
* @returns {boolean}
*/
function isUndefined(obj) {
return obj === undefined;
}
/**
* 将字符串转对象
* @method parseJson
* @param {string} str - 源数据
* @returns {object}
*/
function parseJson(str) {
JSON.stringify(str);
if (str && str !== "") {
try {
return JSON.parse(str);
} catch (error) {
return {};
}
} else {
return {};
}
}
/**
* 获取错误信息
* @method getErrorMessage
* @param {object} obj - error对象
* @returns {string}
*/
function getErrorMessage(obj) {
if (!obj) return;
let external = obj.external;
let msg =
(external && (external.msg || external.message)) ||
obj.msg ||
obj.message ||
obj.errorMsg ||
obj.returnMsg ||
obj.errorMessage ||
"系统繁忙,请稍后再试";
return msg;
}
/**
* 延迟执行函数
* @method delayCall
* @param {function} method - 执行函数
* @param {number} delay - 延迟毫秒
* @returns {any}
*/
function delayCall(method, delay) {
let delayIndex = setTimeout(function () {
if (typeof method == "function") {
method();
} else {
return "函数错误";
}
clearTimeout(delayIndex);
}, delay);
}
/**
* 人民币单位分转元。示例:fen2Yuan(1200000) => 12,000.00
* @method fen2yuan
* @param {number} num - 人民币分
* @returns {string}
*/
function fen2yuan(num) {
let reg = /^[+-]?[1-9]?[0-9]*\.[0-9]*$/;
if (num && num !== "" && reg.test(num)) {
let str = (num / 100).toFixed(2);
let result = "";
let valueParts = str.split(".");
let mostSignificationDigit = valueParts[0].length - 1;
let intervalOfDigit = 0;
let digit, countOfSignificationDigit;
let roundNum = valueParts[0].split(""); //兼容
for (let i = valueParts[0].length - 1; i >= 0; i--) {
digit = roundNum[i];
result = digit + result;
if (digit != "0") {
mostSignificationDigit = i;
}
if (3 == ++intervalOfDigit) {
result = "," + result;
intervalOfDigit = 0;
}
}
if (mostSignificationDigit == -1) {
result = "0";
} else {
countOfSignificationDigit = valueParts[0].length - mostSignificationDigit;
if (countOfSignificationDigit > 3) {
result = result.substring(
result.length -
(countOfSignificationDigit % 3 == 0
? countOfSignificationDigit / 3 - 1
: countOfSignificationDigit / 3) -
countOfSignificationDigit
);
} else {
result = result.substring(result.length - countOfSignificationDigit);
}
}
if (valueParts.length == 2) {
result += ".";
let temp = 2 - valueParts[1].length;
for (let i = 0; i < temp; i++) {
valueParts[1] += "0";
}
result += valueParts[1].substring(0, 2);
} else {
result += ".00";
}
return result;
} else {
return "格式错误";
}
}
/**
* 手机号码分组。示例:13934235567 => 139 3423 5567
* @method groupPhone
* @param {string} str - 手机号码
* @returns {string}
*/
function groupPhone(str) {
let isPhone = /^0?1[3|4|5|6|7|8][0-9]\d{8}$/;
if (isPhone.test(str)) {
return str.replace(/(?=(\d{4})+$)/g, " ");
} else {
return "请输入正确的手机号码";
}
}
/**
* 格式化车牌号码。示例:粤XAA789 =》 粤X.AA789
* @method formatCarNumber
* @param {string} str - 车牌号
* @returns {string}
*/
function formatCarNumber(str) {
str = str.toUpperCase();
let rule = /^(([京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领][A-Z](([0-9]{5}[DF])|([DF]([A-HJ-NP-Z0-9])[0-9]{4})))|([京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领][A-Z][A-HJ-NP-Z0-9]{4}[A-HJ-NP-Z0-9挂学警港澳使领]))$/;
if (rule.test(str)) {
//正则通过
let newStr = str.slice(0, 2) + "." + str.slice(2);
return newStr;
} else {
return "车牌号错误";
}
}
/**
* 获取唯一标识符
* @method getUuid
* @param {number} num - uuid长度
* @returns {string}
*/
function getUuid(num = 24) {
let date = new Date().getTime();
let uuid = "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(
/[xy]/g,
function (c) {
let r = (date + Math.random() * 16) % 16 | 0;
date = Math.floor(date / 16);
return (c == "x" ? r : (r & 0x3) | 0x8).toString(16);
}
);
return (uuid = uuid.slice(0, num));
}
export default {
deepClone,
uniqArray,
getObjectValue,
objectFilter,
isEmpty,
isObject,
isArray,
isUndefined,
parseJson,
getErrorMessage,
delayCall,
fen2yuan,
groupPhone,
formatCarNumber,
getUuid,
};