通过柯里化方法进行表达验证,简化验证步骤
之前验证步骤为
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>
哪里不对希望大家帮忙指点