JavaScript代码片段

Lodash库中的copy

/**

* 节流,多次触发,间隔时间段执行

* @param {Function} func

* @param {Int} wait

* @param {Object} options

*/

export function throttle(func, wait=500, options) {
//container.onmousemove = throttle(getUserAction, 1000);

var timeout, context, args

var previous = 0

if (!options) options = {leading:false,trailing:true}

var later = function() {
previous = options.leading === false ? 0 : new Date().getTime()

timeout = null

func.apply(context, args)

if (!timeout) context = args = null

}

var throttled = function() {
var now = new Date().getTime()

if (!previous && options.leading === false) previous = now

var remaining = wait - (now - previous)

context = this

args = arguments

if (remaining <= 0 || remaining > wait) {
if (timeout) {
clearTimeout(timeout)

timeout = null

}

previous = now

func.apply(context, args)

if (!timeout) context = args = null

} else if (!timeout && options.trailing !== false) {
timeout = setTimeout(later, remaining)

}

}

return throttled

}

第三个参数还有点复杂,options

leading,函数在每个等待时延的开始被调用,默认值为false

trailing,函数在每个等待时延的结束被调用,默认值是true

可以根据不同的值来设置不同的效果:

leading-false,trailing-true:默认情况,即在延时结束后才会调用函数

leading-true,trailing-true:在延时开始时就调用,延时结束后也会调用

leading-true, trailing-false:只在延时开始时调用

例子:

 
8. cleanObject

去除对象中value为空(null,undefined,‘’)的属性,举个例子:

let res=cleanObject({
name:‘’,

pageSize:10,

page:1

})

console.log(“res”, res) //输入{page:1,pageSize:10}   name为空字符串,属性删掉

使用场景是:后端列表查询接口,某个字段前端不传,后端就不根据那个字段筛选,例如name不传的话,就只根据page和pageSize筛选,但是前端查询参数的时候(vue或者react)中,往往会这样定义

export default{
data(){
return {
query:{
name:‘’,

pageSize:10,

page:1

}

}

}

}

const [query,setQuery]=useState({name:‘’,page:1,pageSize:10})

给后端发送数据的时候,要判断某个属性是不是空字符串,然后给后端拼参数,这块逻辑抽离出来就是cleanObject,代码实现如下

export const isFalsy = (value) => (value === 0 ? false : !value);

export const isVoid = (value) =>

value === undefined || value === null || value === “”;

export const cleanObject = (object) => {
// Object.assign({}, object)

if (!object) {
return {};

}

const result = { …object };

Object.keys(result).forEach((key) => {
const value = result[key];

if (isVoid(value)) {
delete result[key];

}

});

return result;

};

let res=cleanObject({
name:‘’,

pageSize:10,

page:1

})

console.log(“res”, res) //输入{page:1,pageSize:10}

剩下的8个在这里:

1. 获取文件后缀名

使用场景:上传文件判断后缀名

/**

* 获取文件后缀名

* @param {String} filename

*/

export function getExt(filename) {
if (typeof filename == ‘string’) {
return filename

.split(‘.’)

.pop()

.toLowerCase()

} else {
throw new Error(‘filename must be a string type’)

}

}

使用方式

getExt(“1.mp4”) //->mp4

2. 复制内容到剪贴板

export function copyToBoard(value) {
const element = document.createElement(‘textarea’)

document.body.appendChild(element)

element.value = value

element.select()

if (document.execCommand(‘copy’)) {
document.execCommand(‘copy’)

document.body.removeChild(element)

return true

}

document.body.removeChild(element)

return false

}

使用方式:

//如果复制成功返回true

copyToBoard(‘lalallala’)

原理:

创建一个textare元素并调用select()方法选中

document.execCommand(‘copy’)方法,拷贝当前选中内容到剪贴板。

3. 休眠多少毫秒

/**

* 休眠xxxms

* @param {Number} milliseconds

*/

export function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms))

}

//使用方式

const fetchData=async()=>{
await sleep(1000)

}

4. 生成随机字符串

/**

* 生成随机id

* @param {*} length

* @param {*} chars

*/

export function uuid(length, chars) {
chars =

chars ||

‘0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ’

length = length || 8

var result = ‘’

for (var i = length; i > 0; --i)

result += chars[Math.floor(Math.random() * chars.length)]

return result

}

使用方式

//第一个参数指定位数,第二个字符串指定字符,都是可选参数,如果都不传,默认生成8位

uuid()

使用场景:用于前端生成随机的ID,毕竟现在的Vue和React都需要绑定key

5. 简单的深拷贝

/**

*深拷贝

* @export

* @param {*} obj

* @returns

*/

export function deepCopy(obj) {
if (typeof obj != ‘object’) {
return obj

}

if (obj == null) {
return obj

}

return JSON.parse(JSON.stringify(obj))

}

缺陷:只拷贝对象、数组以及对象数组,对于大部分场景已经足够

const person={name:‘xiaoming’,child:{name:‘Jack’}}

deepCopy(person) //new person

6. 数组去重

/**

* 数组去重

* @param {*} arr

*/

export function uniqueArray(arr) {
if (!Array.isArray(arr)) {
throw new Error(‘The first parameter must be an array’)

}

if (arr.length == 1) {
return arr

}

return […new Set(arr)]

}

// 原理是利用Set中不能出现重复元素的特性

uniqueArray([1,1,1,1,1])//[1]

7. 对象转化为FormData对象

/**

* 对象转化为formdata

* @param {Object} object

*/

export function getFormData(object) {
const formData = new FormData()

Object.keys(object).forEach(key => {
const value = object[key]

if (Array.isArray(value)) {
value.forEach((subValue, i) =>

formData.append(key + [${i}], subValue)

)

} else {
formData.append(key, object[key])

}

})

return formData

}

使用场景:上传文件时我们要新建一个FormData对象,然后有多少个参数就append多少次,使用该函数可以简化逻辑使用方式:

let req={
file:xxx,

userId:1,

phone:‘15198763636’,

//…

}

fetch(getFormData(req))

8.保留到小数点以后n位

// 保留小数点以后几位,默认2位

export function cutNumber(number, no = 2) {

}

fetch(getFormData(req))

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值