本文仅作常用Javascript方法备份,部分可能采用typescript写法。
1、小驼峰格式转换
许多后端语言都习惯采用大驼峰命名方式,而前端代码多采用小驼峰方式,此时就需要在收到后端数据后进行格式的转换。转换思路就是根据原数据的数据类型进行循环递归转换。如果是数组,则对每个数组元素分别转换后返回新的数组;如果是对象,则遍历对象的属性origKey,将第一个字符调用toLowerCase()换为小写,生成新的属性newKey,用所有newKey和对应原来的值 value组成新的对象,最后返回新的对象。转换代码如下:
export class CamelCaseHelper {
static toCamel(o) {
let newO, origKey, newKey, value
if (o instanceof Array) {
return o.map((value) => {
if (typeof value === "object") {
value = CamelCaseHelper.toCamel(value)
}
return value
})
} else {
newO = {}
for (origKey in o) {
if (o.hasOwnProperty(origKey)) {
newKey = (origKey.charAt(0).toLowerCase() + origKey.slice(1) || origKey).toString()
value = o[origKey]
if (value instanceof Array || (value !== null && value.constructor === Object)) {
value = CamelCaseHelper.toCamel(value)
}
newO[newKey] = value
}
}
}
return newO
}
}
2、对象克隆
在很多不希望修改到源数据的地方会使用到克隆方法。克隆的思路也是根据源数据的类型,遍历全部字段除了值类型外,其他字段都进行递归调用设置为克隆的值。方法可设置克隆深度depth,递归depth过后,超过深度的属性字段就不再克隆,直接进行引用赋值操作。默认depth为-1,即不限制深度,全部进行克隆。代码如下:
/**
* 对象克隆
* @param src 源对象
* @param depth 克隆深度 默认无线大
* @returns 克隆对象
*/
clone(src: any, depth: number = -1): any {
let ret: any;
if (typeof src == "object") {
if (src === null) {
ret = null;
} else {
if (src instanceof Array) {
ret = src.map(a => { return clone(a, depth); });
} else {
if (src instanceof Date) {
ret = src;
} else {
depth--;
ret = {};
if (depth == -1) {
for (let j in src) {
ret[j] = clone(src[j]);
}
} else {
if (depth == 0) {
ret = src;
} else {
for (let j in src) {
ret[j] = clone(src[j], depth);
}
}
}
}
}
}
} else {
ret = src;
}
return ret;
}
3、日期格式化
将日期按照期望格式转换为字符串,方法采用正则匹配替换的方式完成日期到模板字符串的转换。代码如下:
/**
* 格式化显示日期时间
* @param date 日期对象
* @param format 模板(sample "yyyy-MM-dd HH:mm:ss SSS")
*/
dateFormat(date: Date, format: string) {
let o: any = {
"M+": date.getMonth() + 1, //月份
"d+": date.getDate(), //日
"H+": date.getHours(), //小时
"m+": date.getMinutes(), //分
"s+": date.getSeconds(), //秒
"S": date.getMilliseconds() //毫秒
};
if (/(y+)/.test(format))
format = format.replace(RegExp.$1, (date.getFullYear() + "").substr(4 - RegExp.$1.length));
for (let k in o)
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;
}
4、字符串长度截取
很多时候为了保证字符长度不超过容器宽度,需要将字符串进行截取,此时就需要用到截取方法,对超过的部分用指定字符替换。方法须传入想要截取的长度length,未传入length则不会对字符串进行截断,传入suffix字符串作为返回的字符串的结尾。代码如下:
/**
* 字符串长度截取
* @param value 源数据
* @param length 限定的字符串长度
* @param suffix 附加到尾部的字符串
* @returns 实际显示的字符串
*/
stringEllipsis(src: any, length?: number, suffix: string = '...'): any {
if (typeof src !== 'string') {
return src;
}
const len = typeof length === 'undefined' ? src.length : length;
if (src.length <= len) {
return src;
}
return src.substring(0, len) + suffix;
}