工具函数
1. 节流函数
/**
* 节流函数
* fn是我们需要包装的事件回调, interval是时间间隔的阈值
*/
const throttle = (fn, interval) => {
// last为上一次触发回调的时间
let last = 0
interval = interval || 1000
// 将throttle处理结果当作函数返回
return function () {
// 保留调用时的this上下文
let context = this
// 保留调用时传入的参数
let args = arguments
// 记录本次触发回调的时间
let now = +new Date()
// 判断上次触发的时间和本次触发的时间差是否小于时间间隔的阈值
if (now - last >= interval) {
// 如果时间间隔大于我们设定的时间间隔阈值,则执行回调
last = now
fn.apply(context, args)
}
}
}
2. 深拷贝
function cloneDeep(data) {
let copyed_objs = [] // 此数组解决了循环引用和相同引用的问题,它存放已经递归到的目标对象
function _deepCopy(target) {
if (typeof target !== 'object' || !target) {
return target
}
for (let i = 0; i < copyed_objs.length; i++) {
if (copyed_objs[i].target === target) {
return copyed_objs[i].copyTarget
}
}
let obj = {}
if (Array.isArray(target)) {
obj = [] // 处理target是数组的情况
}
copyed_objs.push({ target: target, copyTarget: obj })
Object.keys(target).forEach(key => {
if (obj[key]) {
return
}
obj[key] = _deepCopy(target[key])
})
return obj
}
return _deepCopy(data)
}
3. 生成UUID
/**
* 生成UUID
*/
function generateUUID() {
let d = new Date().getTime()
let uuid = 'xxxxxxxxxxxx4xxxyxxxxxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
// let uuid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
let r = (d + Math.random() * 16) % 16 | 0
d = Math.floor(d / 16)
return (c == 'x' ? r : (r & 0x3) | 0x8).toString(16)
})
return uuid
}
URL
1. 获取 url 中指定参数
function getQueryString(url, name) {
var reg = new RegExp('(^|&|/?)' + name + '=([^&|/?]*)(&|/?|$)', 'i')
var r = url.substr(1).match(reg)
if (r != null) {
return r[2]
}
return null
}
2. 更新 url 中某个 key 的 value 值
/**
* 更新url中某个key的value值
* @param {} uri
* @param {*} key
* @param {*} value
*/
function updateQueryStringParameter(uri, key, value) {
var re = new RegExp('([?&])' + key + '=.*?(&|$)', 'i')
var separator = uri.indexOf('?') !== -1 ? '&' : '?'
if (uri.match(re)) {
return uri.replace(re, '$1' + key + '=' + value + '$2')
} else {
return uri + separator + key + '=' + value
}
}
3. 拼接对象为请求字符串
/**
* 拼接对象为请求字符串
* @param {Object} obj - 待拼接的对象
* @returns {string} - 拼接成的请求字符串
*/
const encodeUrlParams = obj => {
const params = []
Object.keys(obj).forEach(key => {
let value = obj[key]
// 如果值为undefined我们将其置空
if (typeof value === 'undefined') {
value = ''
}
// 对于需要编码的文本(比如说中文)我们要进行编码
params.push([key, value].join('='))
// params.push([key, encodeURIComponent(value)].join('='))
})
return params.join('&')
}
4. 返回一个13位的时间戳
const timestamp = () => new Date().getTime()
数组
1. 数组打乱顺序
function shuffle(arr) {
let length = arr.length,
randomIndex,
temp
while (length) {
randomIndex = Math.floor(Math.random() * length--)
temp = arr[randomIndex]
arr[randomIndex] = arr[length]
arr[length] = temp
}
return arr
}
2. 数组分组
function groupBy(array, fn) {
const groups = {}
array.forEach(function (item) {
const group = JSON.stringify(fn(item))
// 这里利用对象的key值唯一性的,创建数组
groups[group] = groups[group] || []
groups[group].push(item)
})
// 最后再利用map循环处理分组出来
return Object.keys(groups).map(function (group) {
return groups[group]
})
}
// e.g
// const tempList = _operate.groupBy(prizeList, e => {
// return [e.startTime]
// })
3. 根据对象中的某个属性值来进行排序
/**
* 根据对象中的某个属性值来进行排序
* @param {*} property 属性值
* @param {*} type 排序方式 down:降序;默认升序
* arr.sort(compareSort('price'));
*/
function compareSort(property, type) {
return function (a, b) {
let value1 = a[property]
let value2 = b[property]
let result = type === 'down' ? value2 - value1 : value1 - value2
return result
}
}
4. 降维
/**
* 降维
* @param {*} arr
* @returns
*/
function flat(list) {
return list.reduce((acc, val) => acc.concat(val), [])
}
5. 数组运算
/**
* 数组运算
* @param {*} a 数组1
* @param {*} b 数组2
* @param {*} type 运算属性(交集——intersect,差集——minus,补集——complement,并集——unionSet)
* @returns
*/
function calculationArray(a, b, type) {
type = type ? type : 'intersect' //默认交集运算
let sa = new Set(a)
let sb = new Set(b)
let result = []
switch (type) {
case 'intersect':
// 交集
result = a.filter(x => sb.has(x))
break
case 'minus':
// 差集
result = a.filter(x => !sb.has(x))
break
case 'complement':
// 补集
result = [...a.filter(x => !sb.has(x)), ...b.filter(x => !sa.has(x))]
break
case 'unionSet':
// 并集
result = Array.from(new Set([...a, ...b]))
break
default:
result = a.filter(x => sb.has(x))
break
}
return result
}
数据转换
1. 金额
/**
* 千分位 && 小数点后两位
*/
function handlePrice(num) {
num = num || 0
num = parseFloat(num.toFixed(2)).toString()
let d = ''
if (num.slice(0, 1) === '-') {
d = num.slice(0, 1)
num = num.slice(1)
}
const len = num.length
const index = num.indexOf('.')
if (index === -1) {
num = num + '.00'
} else if (index + 2 === len) {
num = num + '0'
}
const index2 = num.indexOf('.') // 字符出现的位置
const num2 = num.slice(-3)
num = num.slice(0, index2)
let result = ''
while (num.length > 3) {
result = ',' + num.slice(-3) + result
num = num.slice(0, num.length - 3)
}
if (num) {
result = num + result
}
return d + (result + num2)
}
2. 字节对象转字符串
/**
* 字节对象转字符串
* @param {Object} arr
*/
export const byteToString = function (arr) {
if (typeof arr === 'string') {
return arr
}
var str = '',
_arr = arr
for (var i = 0; i < _arr.length; i++) {
var one = _arr[i].toString(2),
v = one.match(/^1+?(?=0)/)
if (v && one.length == 8) {
var bytesLength = v[0].length
var store = _arr[i].toString(2).slice(7 - bytesLength)
for (var st = 1; st < bytesLength; st++) {
store += _arr[st + i].toString(2).slice(2)
}
str += String.fromCharCode(parseInt(store, 2))
i += bytesLength - 1
} else {
str += String.fromCharCode(_arr[i])
}
}
return str
}
3. 字符串转字节
/**
* 字符串转字节
* @param {Object} str
*/
export const stringToArrayBuffer = function (str) {
// 首先将字符串转为16进制
let val = ''
for (let i = 0; i < str.length; i++) {
if (val === '') {
val = str.charCodeAt(i).toString(16)
} else {
val += ',' + str.charCodeAt(i).toString(16)
}
}
// 将16进制转化为ArrayBuffer
return new Uint8Array(
val.match(/[\da-f]{2}/gi).map(function (h) {
return parseInt(h, 16)
})
).buffer
}
4. 移除空字符 (\u0000)
export const removeNullCharacter = str => {
return str.replace(/\\u([0-9]|[a-fA-F])([0-9]|[a-fA-F])([0-9]|[a-fA-F])([0-9]|[a-fA-F])/g, '')
}
5. 格式化空字符为空字符串
/**
* e.g: \u0000 => ''
*/
export const formatNullCharacter = str => {
if (!str) return ''
return JSON.parse(removeNullCharacter(JSON.stringify(str)))
}