柯里化方法进行表单验证

通过柯里化方法进行表达验证,简化验证步骤
之前验证步骤为

if(判断式(值1)){
	函数1
}
if(判断式(值2)){
	函数2
}
if(判断式(值3)){
	函数3
}

柯里化后

let demo = verificationData("值1","提示文案1","判断式1")
							("值2","提示文案2","判断式1")
							("值3","提示文案3","判断式1")

虽然不是标准柯里化函数,但是对于自己对柯里化了解有很大帮助
网上的柯里化函数给了一些经验,网址忘了,十分感谢作者

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>柯里化</title>
	</head>
	<body>

		<p>点击按钮计算数组元素相加后的总和。</p>
		<button onclick="myFunction()">点我</button>

		<p>a: <span id="demoa"></span></p>

		<p>b: <span id="demob"></span></p>

		<p>c: <span id="democ"></span></p>

		<p>d: <span id="demod"></span></p>

		<script>
			function add() {
				// 第一次执行时,定义一个数组专门用来存储所有的参数
				var _args = [].slice.call(arguments);

				// 在内部声明一个函数,利用闭包的特性保存_args并收集所有的参数值
				var adder = function() {
					var _adder = function() {
						// [].push.apply(_args, [].slice.call(arguments));
						_args.push(...arguments);
						return _adder;
					};

					// 利用隐式转换的特性,当最后执行时隐式转换,并计算最终的值返回
					_adder.toString = function() {
						return _args.reduce(function(a, b) {
								console.log("a为缓存的数据:",a,"\nb为新数据进入:",b)
							if (a == b) {
								return a * b;
							}
							return a + b
						});
					}

					return _adder;
				}
				// return adder.apply(null, _args);
				return adder(..._args);
			}

			var a = add(1)(1)(1)(1);
			var b = add(2)(2, 4)(16);
			var c = add("字符串")(1, 2)(3, 4); 
			var d = add(1, 2, 3)(0);


			function myFunction(item) {
				document.getElementById("demoa").innerHTML = a;
				document.getElementById("demob").innerHTML = b;
				document.getElementById("democ").innerHTML = c;
				document.getElementById("demod").innerHTML = d;
			}
		</script>

	</body>
</html>

以下是我对表单验证的函数进行柯里化的函数

/**
			 * @method 作者:古月孤魂
			 * @param {Type} data 验证目标对象
			 * 值1:被验证的数据
			 * 值2:toast文案
			 * 值3:验证规则,正则表达式
			 * 值4:验证规则:函数验证
			 * 值5:成功回调函数
			 * 值6:失败回调函数
			 * 值7:结束回调函数
			 * @returns {Type} 首个错误对象,无错误对象返回true表示通过
			 * @desc 对整体验证函数进行封装
			 * @throws {string} 正则表达式为非法输入
			 */
			function verificationData() {
				/**
				 * @method 作者:古月孤魂
				 * @param {List} 函数参数数组
				 * @returns {Type} 标准对象
				 * @desc 工厂函数=>将获取到的数据进行重新排列
				 */
				function arguments2Standard(arguments) {
					if(!arguments[1]) throw new Error('验证失败提示文案为必填项');
					let rule = (function(ruleRegExp = '') {
						if (ruleRegExp instanceof Function) {
							return ruleRegExp //执行自定义函数
						}
						if (!ruleRegExp) {
							return "isEmpty" //执行非空验证
						}
						if (ruleRegExp instanceof RegExp) {
							return ruleRegExp
						}
						
						switch (ruleRegExp) {
							case "phonenum":
								return /^(13[0-9]|14[5|7]|15[0|1|2|3|4|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\d{8}$/;
							case "E-mail":
								return /^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/;
							case "number":
								return /^[0-9]*$/;
							case "noString":
								return "isEmpty";
							case "select":
								return "isSelectJustData";
							default:

								throw new Error('验证规则中正则表达式为非法输入');
								return
						}
					})(arguments[2])
					return {
						data: arguments[0],
						toast: arguments[1],
						rule: rule,
						success_function: arguments[3],
						failed_function: arguments[4],
						complete_function: arguments[5]
					}
				}
				var _datas = [arguments2Standard(arguments)]
				var verifyData = function() {
					var _verifyData = function() {
						_datas.push(arguments2Standard(arguments));
						return _verifyData;
					};
					_verifyData.toString = function() {
						let failed = _datas.find(function(findListData) {
							let rule = findListData.rule;
							
							let verifyDataResult = false;
							if (rule instanceof RegExp) {
								verifyDataResult = rule.test(findListData.data)
							}
							if (typeof rule == 'string') {
								verifyDataResult = verifyDataConformRuleOfRuleIsString(findListData)
							}
							if(findListData.rule instanceof Function){
								let rule_return = findListData.rule(findListData.data);
								if(typeof rule_return != 'boolean') throw new Error('验证规则必须有布尔类型返回值');
								verifyDataResult =  rule_return
							}
							verifyDataResult?(findListData.success_function&&findListData.success_function(findListData.data)):(findListData.failed_function&&findListData.failed_function(findListData.data))
							findListData.complete_function&&findListData.complete_function(findListData.data)
							return !verifyDataResult
						})
						console.log("不符合规则的数据", failed||failed&&failed.data)
						
						return failed == undefined || failed.toast
					}
					
					function verifyDataConformRuleOfRuleIsString(verifyDataConformRuleData) {
						if(verifyDataConformRuleData.rule==='isEmpty'){
							return !!verifyDataConformRuleData.data
						}
						//作者:古月孤魂
						if(verifyDataConformRuleData.rule==='isSelectJustData'){
							return (function(isSelectJustData_Data){
								//无数据
								if (!isSelectJustData_Data) return false;
								//无名称
								if (!isSelectJustData_Data.name) return false; 
								//无id
								if (!isSelectJustData_Data.id) return false;
								//id为提示专用id
								if (isSelectJustData_Data.id == -1) return false;
								
								return true;
							})(verifyDataConformRuleData.data)
						}
						
					}
					return _verifyData;
				}
				return verifyData(_datas);
			}

html测试代码如下

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>柯里化_对象处理—古月孤魂</title>
	</head>
	<body>


		<p>a: <span id="demoa"></span></p>

		<!-- <p>b: <span id="demob"></span></p> -->

		<!-- <p>c: <span id="democ"></span></p> -->

		<!-- <p>d: <span id="demod"></span></p> -->

		<p>e: <span id="demoe"></span></p>

		<script>
			function add() {
				// 第一次执行时,定义一个数组专门用来存储所有的参数
				var _args = [].slice.call(arguments);

				// 在内部声明一个函数,利用闭包的特性保存_args并收集所有的参数值
				var adder = function() {
					var _adder = function() {
						// [].push.apply(_args, [].slice.call(arguments));
						_args.push(...arguments);
						return _adder;
					};

					// 利用隐式转换的特性,当最后执行时隐式转换,并计算最终的值返回
					_adder.toString = function() {
						let demo = _args.find(function(data) {
							return data.isOk == false
						})
						return demo == undefined
					}

					return _adder;
				}
				// return adder.apply(null, _args);
				return adder(..._args);
			}
			/**
			 * @method 作者:古月孤魂
			 * @param {Type} data 验证目标对象
			 * 值1:被验证的数据
			 * 值2:toast文案
			 * 值3:验证规则,正则表达式
			 * 值4:验证规则:函数验证
			 * 值5:成功回调函数
			 * 值6:失败回调函数
			 * 值7:结束回调函数
			 * @returns {Type} 首个错误对象,无错误对象返回true表示通过
			 * @desc 对整体验证函数进行封装
			 * @throws {string} 正则表达式为非法输入
			 */
			function verificationData() {
				/**
				 * @method 作者:古月孤魂
				 * @param {List} 函数参数数组
				 * @returns {Type} 标准对象
				 * @desc 工厂函数=>将获取到的数据进行重新排列
				 */
				function arguments2Standard(arguments) {
					if(!arguments[1]) throw new Error('验证失败提示文案为必填项');
					let rule = (function(ruleRegExp = '') {
						if (ruleRegExp instanceof Function) {
							return ruleRegExp //执行自定义函数
						}
						if (!ruleRegExp) {
							return "isEmpty" //执行非空验证
						}
						if (ruleRegExp instanceof RegExp) {
							return ruleRegExp
						}
						
						switch (ruleRegExp) {
							case "phonenum":
								return /^(13[0-9]|14[5|7]|15[0|1|2|3|4|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\d{8}$/;
							case "E-mail":
								return /^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/;
							case "number":
								return /^[0-9]*$/;
							case "noString":
								return "isEmpty";
							case "select":
								return "isSelectJustData";
							default:

								throw new Error('验证规则中正则表达式为非法输入');
								return
						}
					})(arguments[2])
					return {
						data: arguments[0],
						toast: arguments[1],
						rule: rule,
						success_function: arguments[3],
						failed_function: arguments[4],
						complete_function: arguments[5]
					}
				}
				var _datas = [arguments2Standard(arguments)]
				var verifyData = function() {
					var _verifyData = function() {
						_datas.push(arguments2Standard(arguments));
						return _verifyData;
					};
					_verifyData.toString = function() {
						let failed = _datas.find(function(findListData) {
							let rule = findListData.rule;
							
							let verifyDataResult = false;
							if (rule instanceof RegExp) {
								verifyDataResult = rule.test(findListData.data)
							}
							if (typeof rule == 'string') {
								verifyDataResult = verifyDataConformRuleOfRuleIsString(findListData)
							}
							if(findListData.rule instanceof Function){
								let rule_return = findListData.rule(findListData.data);
								if(typeof rule_return != 'boolean') throw new Error('验证规则必须有布尔类型返回值');
								verifyDataResult =  rule_return
							}
							verifyDataResult?(findListData.success_function&&findListData.success_function(findListData.data)):(findListData.failed_function&&findListData.failed_function(findListData.data))
							findListData.complete_function&&findListData.complete_function(findListData.data)
							return !verifyDataResult
						})
						console.log("不符合规则的数据", failed||failed&&failed.data)
						
						return failed == undefined || failed.toast
					}
					
					function verifyDataConformRuleOfRuleIsString(verifyDataConformRuleData) {
						if(verifyDataConformRuleData.rule==='isEmpty'){
							return !!verifyDataConformRuleData.data
						}
						// 作者:古月孤魂
						if(verifyDataConformRuleData.rule==='isSelectJustData'){
							return (function(isSelectJustData_Data){
								//无数据
								if (!isSelectJustData_Data) return false;
								//无名称
								if (!isSelectJustData_Data.name) return false; 
								//无id
								if (!isSelectJustData_Data.id) return false;
								//id为提示专用id
								if (isSelectJustData_Data.id == -1) return false;
								
								return true;
							})(verifyDataConformRuleData.data)
						}
						
					}
					return _verifyData;
				}
				return verifyData(_datas);
			}
			// var a = add({data:1,isOk:true})({data:2,isOk:false})({data:3,isOk:true})({data:4,isOk:true})({data:5,isOk:true})({data:6,isOk:true},{data:7,isOk:true})({data:8,isOk:true})({data:9,isOk:true})({data:10,isOk:false});
			// var b = add({data:1,isOk:true},{data:2,isOk:true},{data:3,isOk:true})({data:4,isOk:false}, {data:5,isOk:true})({data:6,isOk:true});
			// var c = add({data:1,isOk:true})({data:2,isOk:true}, {data:3,isOk:true})({data:4,isOk:true}, {data:5,isOk:true}); 
			var d = add({
				data: 1,
				isOk: false
			}, {
				data: 2,
				isOk: true
			}, {
				data: 3,
				isOk: false
			})({
				data: 4,
				isOk: false
			});
			var e = verificationData("13812341234", "吐司内容1",
					/^(13[0-9]|14[5|7]|15[0|1|2|3|4|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\d{8}$/)
				("123", "吐司内容2", /^[0-9]*$/)
				("undefined", "吐司内容9")
				("13812341234", "吐司内容3", "phonenum")
				("13812341234", "吐司内容4", "")
				("123", "吐司内容5", "")
				(123, "吐司内容6",data => data === 123)
				("123", "吐司内容6",function(data){return data==="123"})
				({id:123,name:"选择数据"}, "吐司内容6", "select",function(data){console.log("成功回调",data)},function(data){console.log("失败回调",data)},function(data){console.log("结束回调",data)})
				({id:1234,name:"13"}, "吐司内容6",function(data){return data.id==1234},function(data){console.log("成功回调",data)},function(data){console.log("失败回调",data)},function(data){console.log("结束回调",data)})
			var a = verificationData("数据1","文案1")
									("数据2","文案2")
									("","文案3")
			myFunction();

			function myFunction(item) {
				document.getElementById("demoa").innerHTML = a;
				// document.getElementById("demob").innerHTML = b;
				// document.getElementById("democ").innerHTML = c;
				// document.getElementById("demod").innerHTML = d;
				document.getElementById("demoe").innerHTML = e;
			}
		</script>

	</body>
</html>

哪里不对希望大家帮忙指点

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_默_

别打赏了,点点赞,点点关注就行

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值