工具函数
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)))}