1.0.16 • Published 4 years ago

@emmafgy/util v1.0.16

Weekly downloads
-
License
ISC
Repository
-
Last release
4 years ago

源码如下

/**
 * 柯里化
 * 把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,
 * 并且返回接受余下的参数且返回结果的新函数
 */
export const curryIt = (fn) => {
	//获取fn参数的数量
	var n = fn.length;
	//声明一个数组args
	var args = [];
	//返回一个匿名函数
	return function(arg) {
		//将curryIt后面括号中的参数放入数组
		args.push(arg);
		//如果args中的参数个数小于fn函数的参数个数,
		//则执行arguments.callee(其作用是引用当前正在执行的函数,这里是返回的当前匿名函数)。
		//否则,返回fn的调用结果
		if (args.length < n) {
			return arguments.callee;
		} else {
			return fn.apply(null, args);
		}
	}
}

// 复制到粘贴板
export const copy = (text) => {
	var textareaEl = document.createElement('textarea');
	textareaEl.setAttribute('readonly', 'readonly'); // 防止手机上弹出软键盘
	textareaEl.value = text;
	document.body.appendChild(textareaEl);
	textareaEl.select();
	var res = document.execCommand('copy');
	document.body.removeChild(textareaEl);
	return res;
}

// 一般用于导出txt文件
export const export1 = (name, data) => {

	const fakeClick = (obj) => {
		var ev = document.createEvent('MouseEvents')
		ev.initMouseEvent('click', true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null)
		obj.dispatchEvent(ev)
	}

	var urlObject = window.URL || window.webkitURL || window
	var export_blob = new Blob([data])
	var save_link = document.createElementNS('http://www.w3.org/1999/xhtml', 'a')
	save_link.href = urlObject.createObjectURL(export_blob)
	save_link.download = name
	fakeClick(save_link)
}

/**
 * 获取 location.search 参数
 * 从问号 (?) 开始的 URL(查询部分)
 */
export const getLocationSearchParam = (sProp) => {
	var re = new RegExp(sProp + "=([^\&]*)", "i");
	var a = re.exec(document.location.search);
	return a == null ? null : a[1];
};

//金钱格式 9,999,999.99
export const formatPay = (num, symbol = "", fixedNum = 2) => {
	return (
		symbol + parseFloat(num).toFixed(fixedNum).replace(/\d{1,3}(?=(\d{3})+(\.\d*)?$)/g, "$&,")
	);
}

// 多维数组转一维 [1,2,[3],[4,[5]]]
export const flatten = arr => [].concat(...arr.map(x => Array.isArray(x) ? flatten(x) : x));

/**
 * 防抖函数
 * @param func 事件触发的操作
 * @param delay 多少毫秒内连续触发事件,不会执行
 * @returns {Function}
 */
export const debounce = (func, delay) => {
	let timer = null;
	return function() {
		timer && clearTimeout(timer);
		// setTimeOut 务必使用箭头函数 确保 this ,arguments 作用域是父级函数
		timer = setTimeout(_ => {
			func(arguments);
		}, delay);
	}
}

/**
 * 节流函数
 * @param func 事件触发的操作
 * @param mustRunDelay 间隔多少毫秒需要触发一次事件
 */
export const throttle = (func, wait, mustRun) => {
	let timeout,
		startTime = new Date();
	return function() {
		let curTime = new Date();
		timeout && clearTimeout(timeout);
		// 如果达到了规定的触发时间间隔,触发 handler
		if (curTime - startTime >= mustRun) {
			func(arguments);
			startTime = curTime;
			// 没达到触发间隔,重新设定定时器
		} else {
			// setTimeOut 务必使用箭头函数 确保 this ,arguments 作用域是父级函数
			timeout = setTimeout(_ => {
				func(arguments);
			}, wait);
		}
	};
};

/**
 * 深拷贝
 * @param {Object} obj
 */
export const clone = (obj) => {
	let res;
	if (typeof obj == 'object' && obj != null) {
		res = obj instanceof Array ? [] : {};
		for (let i in obj) {
			res[i] = clone(obj[i]);
		}
	} else {
		res = obj;
	}
	return res;
}

/**
 * 首字母 大写
 */
export const firstToUpperCase = str => str.charAt(0).toUpperCase() + str.slice(1);


//计算指定日期后几天
export const getNextDate = (date, num, type = 'day') => {

	try {
		var dd = date ? new Date(date) : new Date();
		if (type == 'month') {
			dd.setMonth(dd.getMonth() + num);
		} else {
			dd.setDate(dd.getDate() + num);
		}
		var y = dd.getFullYear();
		var m = dd.getMonth() + 1 < 10 ? "0" + (dd.getMonth() + 1) : dd.getMonth() + 1;
		var d = dd.getDate() < 10 ? "0" + dd.getDate() : dd.getDate();
		return y + "-" + m + "-" + d;
	} catch (e) {
		return "1970-00-00";
	}

};

// 获取当月天数
export const getCurrentMonthDays = (date) => {
	var date = date ? new Date(date) : new Date(); //0 表示1月
	date.setDate(28); // 防止setMOnth + 1 c超出(+1 是加上当月天数 来计算下个月份的)
	date.setMonth(date.getMonth() + 1);
	// 日期设置为0号, 0表示1号的前一天
	date.setDate(0);
	return date.getDate();
	//console.log(date.getDate())
}

// return function 注意 compose 中函数执行的顺序是从右到左, 每次函数运行结果作为下个函数的参数
export const compose = (...funcs) => {
	if (funcs.length === 0) {
		return arg => arg;
	}
	if (funcs.length === 1) {
		return funcs[0];
	}
	return funcs.reduce((a, b) => (...args) => a(b(...args)));
}


// ================== reg  start ==================

/**
 * 检测是否为NUMBER
 */
export const checkNumber = val => /^[0-9]+$/.test(val);

// 手机号检查
export const checkPhone = (mobile) => {
	let reg = /^1[0-9]{10}$/;
	return reg.test(mobile);
};

// 身份证校验
export const checkID = (id_number) => {
	if (id_number && id_number.length === 18) {
		let nums = id_number.split('');
		let weights = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];
		let sum = 0;
		weights.forEach(function(weight, index) {
			sum += weight * nums[index];
		});
		let checkNum = 12 - sum % 11;
		if (checkNum === 10) {
			checkNum = 'X';
		} else if (checkNum > 10) {
			checkNum = checkNum - 11;
		}
		//console.log('check num: ' + checkNum);
		return checkNum.toString() === nums[17].toUpperCase();
	} else {
		return false;
	}
};


// ================== reg  end ==================
1.0.16

4 years ago

1.0.15

4 years ago

1.0.14

4 years ago

1.0.13

4 years ago

1.0.12

4 years ago

1.0.11

4 years ago

1.0.9

4 years ago

1.0.10

4 years ago

1.0.8

4 years ago

1.0.7

4 years ago

1.0.6

4 years ago

1.0.5

4 years ago

1.0.4

4 years ago

1.0.3

4 years ago

1.0.2

4 years ago

1.0.1

4 years ago

1.0.0

4 years ago