通用JavaScript方法封装
在现代Web开发中,许多应用程序都需要处理常见的操作,如日期格式化、表单重置、数据字典回显、树形结构数据构建等。为了提高开发效率并减少重复代码,我们可以将这些常用的操作封装成通用函数,以便在多个项目中复用。以下是一些常用的JavaScript方法封装,它们可以大大简化前端开发中的任务。
1. 日期格式化 parseTime
日期和时间的格式化是Web开发中经常遇到的需求,parseTime 方法能够将时间对象或时间戳格式化为指定格式的字符串。
javascript
复制代码
export function parseTime(time, pattern) {
if (arguments.length === 0 || !time) {
return null;
}
const format = pattern || '{y}-{m}-{d} {h}:{i}:{s}';
let date;
if (typeof time === 'object') {
date = time;
} else {
if ((typeof time === 'string') && (/^[0-9]+$/.test(time))) {
time = parseInt(time);
} else if (typeof time === 'string') {
time = time.replace(new RegExp(/-/gm), '/').replace('T', ' ').replace(new RegExp(/.[\d]{3}/gm), '');
}
if ((typeof time === 'number') && (time.toString().length === 10)) {
time = time * 1000;
}
date = new Date(time);
}
const formatObj = {
y: date.getFullYear(),
m: date.getMonth() + 1,
d: date.getDate(),
h: date.getHours(),
i: date.getMinutes(),
s: date.getSeconds(),
a: date.getDay()
};
const time_str = format.replace(/{(y|m|d|h|i|s|a)+}/g, (result, key) => {
let value = formatObj[key];
if (key === 'a') { return ['日', '一', '二', '三', '四', '五', '六'][value]; }
if (result.length > 0 && value < 10) {
value = '0' + value;
}
return value || 0;
});
return time_str;
}
2. 表单重置 resetForm
在开发中,表单重置是一个常见需求。resetForm 方法可以快速清空表单中的所有数据,重置表单字段。
javascript
复制代码
export function resetForm(refName) {
if (this.$refs[refName]) {
this.$refs[refName].resetFields();
}
}
3. 添加日期范围 addDateRange
在某些情况下,我们需要将用户选择的日期范围添加到请求参数中。addDateRange 方法能够将日期范围自动添加到请求参数中。
javascript
复制代码
export function addDateRange(params, dateRange, propName) {
let search = params;
search.params = typeof (search.params) === 'object' && search.params !== null && !Array.isArray(search.params) ? search.params : {};
dateRange = Array.isArray(dateRange) ? dateRange : [];
if (typeof (propName) === 'undefined') {
search.params['beginTime'] = dateRange[0];
search.params['endTime'] = dateRange[1];
} else {
search.params['begin' + propName] = dateRange[0];
search.params['end' + propName] = dateRange[1];
}
return search;
}
4. 数据字典回显 selectDictLabel 和 selectDictLabels
在前端开发中,我们经常需要将后端返回的数值字典转化为用户友好的标签。selectDictLabel 和 selectDictLabels 方法可以帮助你实现这一点。
javascript
复制代码
export function selectDictLabel(datas, value) {
if (value === undefined) {
return "";
}
var actions = [];
Object.keys(datas).some((key) => {
if (datas[key].value == ('' + value)) {
actions.push(datas[key].label);
return true;
}
})
if (actions.length === 0) {
actions.push(value);
}
return actions.join('');
}
export function selectDictLabels(datas, value, separator) {
if (value === undefined || value.length === 0) {
return "";
}
if (Array.isArray(value)) {
value = value.join(",");
}
var actions = [];
var currentSeparator = undefined === separator ? "," : separator;
var temp = value.split(currentSeparator);
Object.keys(value.split(currentSeparator)).some((val) => {
var match = false;
Object.keys(datas).some((key) => {
if (datas[key].value == ('' + temp[val])) {
actions.push(datas[key].label + currentSeparator);
match = true;
}
})
if (!match) {
actions.push(temp[val] + currentSeparator);
}
})
return actions.join('').substring(0, actions.join('').length - 1);
}
5. 字符串格式化 sprintf
字符串格式化是另一种常见需求,sprintf 方法可以将占位符 %s 替换为实际的参数。
javascript
复制代码
export function sprintf(str) {
var args = arguments, flag = true, i = 1;
str = str.replace(/%s/g, function () {
var arg = args[i++];
if (typeof arg === 'undefined') {
flag = false;
return '';
}
return arg;
});
return flag ? str : '';
}
6. 转换字符串为空 parseStrEmpty
在处理数据时,我们经常需要将 undefined 或 null 转换为空字符串。parseStrEmpty 方法可以帮助我们实现这一点。
javascript
复制代码
export function parseStrEmpty(str) {
if (!str || str == "undefined" || str == "null") {
return "";
}
return str;
}
7. 数据合并 mergeRecursive
mergeRecursive 方法可以将两个对象进行递归合并,合并过程中如果遇到对象类型的值会递归合并,非对象类型的值会覆盖源对象中的值。
javascript
复制代码
export function mergeRecursive(source, target) {
for (var p in target) {
try {
if (target[p].constructor == Object) {
source[p] = mergeRecursive(source[p], target[p]);
} else {
source[p] = target[p];
}
} catch (e) {
source[p] = target[p];
}
}
return source;
};
8. 构造树形结构数据 handleTree
构造树形结构数据在许多场景中都非常有用,特别是在处理菜单或组织结构数据时。handleTree 方法可以将扁平的数据转化为树形结构。
javascript
复制代码
export function handleTree(data, id, parentId, children) {
let config = {
id: id || 'id',
parentId: parentId || 'parentId',
childrenList: children || 'children'
};
var childrenListMap = {};
var nodeIds = {};
var tree = [];
for (let d of data) {
let parentId = d[config.parentId];
if (childrenListMap[parentId] == null) {
childrenListMap[parentId] = [];
}
nodeIds[d[config.id]] = d;
childrenListMap[parentId].push(d);
}
for (let d of data) {
let parentId = d[config.parentId];
if (nodeIds[parentId] == null) {
tree.push(d);
}
}
for (let t of tree) {
adaptToChildrenList(t);
}
function adaptToChildrenList(o) {
if (childrenListMap[o[config.id]] !== null) {
o[config.childrenList] = childrenListMap[o[config.id]];
}
if (o[config.childrenList]) {
for (let c of o[config.childrenList]) {
adaptToChildrenList(c);
}
}
}
return tree;
}
9. 参数处理 tansParams
有时我们需要将对象格式的参数转化为查询字符串格式,tansParams 方法可以将对象中的嵌套属性转换为URL参数格式。
javascript
复制代码
export function tansParams(params) {
let result = '';
for (const propName of Object.keys(params)) {
const value = params[propName];
var part = encodeURIComponent(propName) + "=";
if (value !== null && value !== "" && typeof (value) !== "undefined") {
if (typeof value === 'object') {
for (const key of Object.keys(value)) {
if (value[key] !== null && value[key] !== "" && typeof (value[key]) !== 'undefined') {
let params = propName + '[' + key + ']';
var subPart = encodeURIComponent(params) + "=";
result += subPart + encodeURIComponent(value[key]) + "&";
}
}
} else {
result += part + encodeURIComponent(value) + "&";
}
}
}
return result;
}
10. 获取标准路径 getNormalPath
getNormalPath 方法能够修正路径格式,确保路径符合标准。
javascript
复制代码
export function getNormalPath(p) {
if (p.length === 0 || !p || p == 'undefined') {
return p;
};
let res = p.replace('//', '/');
if (res[res.length - 1] === '/') {
return res.slice(0, res.length - 1);
}
return res;
}
11. 验证Blob格式 blobValidate
blobValidate 方法可以判断文件是否为非JSON格式的Blob对象。
javascript
复制代码
export function blobValidate(data) {
return data.type !== 'application/json';
}
通过将这些通用的方法封装成独立的函数,我们能够提高开发效率,并减少重复代码。这些函数能够帮助开发者轻松实现常见的需求,如日期格式化、表单操作、树形结构处理等,进而提升整个项目的可维护性和开发体验。
4o