Javascript 常用的工具函数,更新中...
时间戳转为格式化时间
/**
* 时间戳转为格式化时间
* @Author chenjun
* @DateTime 2017-11-10
* @param {[date]} timestamp [时间戳]
* @param {[string]} formats [时间格式]
*/
function formatDate(timestamp, formats) {
/*
formats格式包括
1. Y-M-D
2. Y-M-D h:m:s
3. Y年M月D日
4. Y年M月D日 h时m分
5. Y年M月D日 h时m分s秒
示例:console.log(formatDate(1500305226034, 'Y年M月D日 h:m:s')) ==> 2017年07月17日 23:27:06
*/
formats = formats || 'Y-M-D';
var myDate = timestamp ? new Date(timestamp) : new Date();
var year = myDate.getFullYear();
var month = formatDigit(myDate.getMonth() + 1);
var day = formatDigit(myDate.getDate());
var hour = formatDigit(myDate.getHours());
var minute = formatDigit(myDate.getMinutes());
var second = formatDigit(myDate.getSeconds());
return formats.replace(/Y|M|D|h|m|s/g, function(matches) {
return ({
Y: year,
M: month,
D: day,
h: hour,
m: minute,
s: second
})[matches];
});
// 小于10补0
function formatDigit(n) {
return n.toString().replace(/^(\d)$/, '0$1');
};
}
千分位显示,常用于价格显示:
// 千分位
function toThousands(num) {
return parseFloat(num).toFixed(2).replace(/(\d{1,3})(?=(\d{3})+(?:\.))/g, "$1,");
}
超出显示省略号
// 超出显示省略号
function cutString(str, len) {
//length属性读出来的汉字长度为1
if (str.length * 2 <= len) {
return str;
}
var strlen = 0;
var s = "";
for (var i = 0; i < str.length; i++) {
s = s + str.charAt(i);
if (str.charCodeAt(i) > 128) {
strlen = strlen + 2;
if (strlen >= len) {
return s.substring(0, s.length - 1) + "...";
}
} else {
strlen = strlen + 1;
if (strlen >= len) {
return s.substring(0, s.length - 2) + "...";
}
}
}
return s;
}
生成随机整数
// 生成随机整数
function random(min, max) {
return Math.floor(Math.random() * (max - min + 1)) + min;
}
生成uuid
function getuuid() {
var s = [];
var hexDigits = "0123456789abcdef";
for (var i = 0; i < 36; i++) {
s[i] = hexDigits.substr(Math.floor(Math.random() * 0x10), 1);
}
s[14] = "4"; // bits 12-15 of the time_hi_and_version field to 0010
s[19] = hexDigits.substr((s[19] & 0x3) | 0x8, 1); // bits 6-7 of the clock_seq_hi_and_reserved to 01
s[8] = s[13] = s[18] = s[23] = "-";
var uuid = s.join("");
return uuid;
}
获取url参数,兼容hash后的参数(可获取中文参数)
function getQueryString(name) {
let search = window.location.search.substr(1) || window.location.hash.split('?')[1];
let reg = new RegExp('(^|&)' + name + '=([^&]*)(&|$)');
if (!search) return;
let r = search.match(reg);
if (r != null) return decodeURI(r[2]);
return null;
}
手写clone深拷贝函数
function clone(obj) {
var result = null;
if (obj instanceof Array) {
result = [];
for (var i = 0; i < obj.length; i++) {
result[i] = clone(obj[i]);
}
return result;
} else if (obj instanceof Object) {
result = {};
for (var i in obj) {
result[i] = clone(obj[i]);
}
return result;
} else {
return obj;
}
}
console.log(clone({ "a": 1, "b": 2, "c": [1, 3] }));
将10进制数字转为32字节二进制数;
# 方法一、
function intToBytes32(data) {
var binary = '';
for (var i = 0; i < 32; i++) {
binary += (data >> (31 - i)) & 1;
}
console.log(binary);
}
intToBytes32(28);// ===> 00000000000000000000000000011100
# 方法二:
function intToBytes32(data) {
var binary = data.toString(2);
var s = '00000000000000000000000000000000';
console.log(s.substr(0, s.length - binary.length) + binary);
}
交换数组前后两个位置
function togglePosition(arr, flag) {
for (var i = 0; i < arr.length; i++) {
if (arr.length % 2 == 0) {
for (var j = 1; j < arr.length - 1; j++) {
var temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
} else {
for (var j = 1; j < arr.length; j++) {
var temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
}
return flag ? arr.reverse() : arr;
};
var arr = [12, 13, 14, 15, 16, 17];
togglePosition(arr, false) // ==>[14, 12, 15, 14, 17, 16]
数组扁平化
取出嵌套数组(多维)中的所有元素放到一个新数组(一维)中,如: [1, [3, [2, 4]]] ==> [1, 3, 2, 4],实现方法:递归 + concat
// 方法一:
function flat1(arr) {
// 准备结果数组
const result = [];
// 循环
for (let i = 0; i < arr.length; i++) {
// 如果是数组
if (Array.isArray(arr[i])) {
// 递归 展开 推入
result.push(...flat1(arr[i]));
// result = result.concat(flatten(arr[i]))
} else {
result.push(arr[i]);
}
}
// 返回
return result;
}
// 测试
const arr = [1, 2, [3, 4, [5, 6]], 7];
const newArr = flat1(arr);
console.log(newArr); // [1, 2, 3, 4, 5, 6, 7]
// 方法二:
function flat2(arr) {
// 浅克隆传入数组 不改变原数组
let result = [...arr];
// 当数组里面有一个数组时
while (result.some((item) => Array.isArray(item))) {
// 展开合并
result = [].concat(...result);
}
// 返回
return result;
}
数组分块
语法: chunk(array, size),功能: 将数组拆分成多个 size 长度的区块,每个区块组成小数组,整体组成一个二维数组,如: [1, 3, 5, 6, 7, 8] 调用chunk(arr, 4) ==> [[1, 3, 5, 6], [7,8]]
function chunk(arr, size = 1) {
// 准备结果和临时数组
const result = [];
let temp = [];
// 遍历
arr.forEach((item) => {
// 当临时数组为空推入结果数组
if (temp.length === 0) {
result.push(temp);
}
// 往临时数组推入数组项
temp.push(item);
// 当推入数组项达到传入分块长度时重新赋值空数组循环判断 直到循环结束返回
if (temp.length === size) {
temp = [];
}
});
// 返回
return result;
}
// 测试
const arr = [1, 2, 3, 4, 5, 6, 7];
const newArr = chunk(arr, 3);
console.log(newArr); // [[1, 2, 3], [4, 5, 6], [7]]