在最近一个项目中,表单验证需要对时间的起止范围进行判断:结束时间需大于或等于开始时间。即:结束年须大于起始年;如果相等,则比较起始月与结束月;如果起止月也相等,则比较日期。那么,对于每一次验证,可以用下面这个函数来进行比较。
- function compare(begin,end,error){
- var begin = parseInt(begin,10);
- var end = parseInt(end,10);
- var diff = end - begin;
- if(diff < 0){
- alert(error);
- }else{
- return true;
- }
- }
这样,在验证的时候,只要结果返回真就表示通过。如:
- var year = compare(2001,2003,'年');
- var month = compare(1,2,'月');
- var day = compare(12,13,'天');
- alert(year && month && day);
//结果为真------"true"
将上面的起止月份和起止日期修改一下。如:
- var year = compare(2001,2003,'年');
- var month = compare(3,2,'月');
- var day = compare(24,13,'天');
- alert(year && month && day);
/结果为假------"false"
执行结果,依次显示”月”,”天”,”false”;实际上,当起止月份不正确的时候,我们没必要对日期进行验证;月份验证的前提条件是年验证通过;天验证的前提是月份验证通过。仔细分析之后,我决定将上面函数的三个参数用单体模式存储起来,即:
- {
- begin:2001,
- end:2003,
- error:"结束年限须大于起始年限"
- }
但是,我又不想定义函数的参数,函数能否根据传递的参数自动进行验证了?答案是肯定的。在函数的开始,先判断参数的个数,如果大于1,则含有递归处理。如何做到递归处理呢?我在函数内部作了如下处理:
- var len = arguments.length;
- if(len > 1){
- var args = Array.prototype.slice.call(arguments);
- args.shift(); //将第一个参数移除,余下的用作递归处理的参数
- }
对于arguments,我们不能直接调用Array.shift()方法。虽然
arguments有length属性,但毕竟不是数组,所以用Array.slice()方法将其转换成数组。关于arguments,在网上可以了解到更多的信息,这里不在赘述。为什么只有在len大于1时才进行处理呢?因为参数为1时,就不需要进行下一步验证了。递归处理在什么时候进行呢?仔细想想,只有在初始值与结束值相等时才需要,明白了这些,我们就很容易构建我们的验证函数了。
- var diff = parseInt(arguments[0].end,10) -
parseInt(arguments[0].begin,10);
- if(diff <0 ){
- alert(arguments[0].error);
- return false;
- }else if(diff == 0){
- return len > 1 ? arguments.callee.apply(this,args) : true;
- }else{
- return true;
- }
复制代码
上面的代码中,arguments.callee是函数自身,关于apply的用法可以在web查找相关资料。
- function compare(){
- var len = arguments.length;
- if(len > 1){
- var args = Array.prototype.slice.call(arguments);
- args.shift(); //将第一个参数移除,余下的用作递归处理的参数
- }
- var diff = parseInt(arguments[0].end,10) -
parseInt(arguments[0].begin,10);
- if(diff <0 ){
- alert(arguments[0].error);
- return false;
- }else if(diff == 0){
- return len > 1 ? arguments.callee.apply(this,args) : true;
- }else{
- return true;
- }
- }
复制代码
到此验证函数已经完成,但需要注意的是:
1.
虽然没有确定参数的个数,但参数的顺序还是重要的,因为前一个参数的验证结果决定了下一个参数的验证是否继续;
2.
parseInt()函数的第二个参数10不要忽略。如果忽略,当遇到以0开始的数值(如07、08)时将会按八进制进行处理。
到此已经结束,看看 示例
。有时候,我们不想以alert的方式显示错误信息,我们可以自定义处理函数将其作为最后一个参数传入其中。那么在函数的开始,取得处理函数,如:
- var func = arguments[len - 1];
- if(typeof func == 'function'){
- func(arguments[0]);
- }
复制代码
所以,最终的处理函数是这样的:
- function compare(){
- var len = arguments.length;
- var func = arguments[len - 1];
- if(len > 1){
- var args = Array.prototype.slice.call(arguments);
- args.shift(); //将第一个参数移除,余下的用作递归处理的参数
- }
- var diff = parseInt(arguments[0].end,10) -
parseInt(arguments[0].begin,10);
- if(diff <0 ){
- (typeof func == 'function') ? func(arguments[0].error) :
alert(arguments[0].error);
- return false;
- }else if(diff == 0){
- return len > 1 ? arguments.callee.apply(this,args) : true;
- }else{
- return true;
- }
- }
分享到:
相关推荐
代码 RQA对离散时间序列进行递归图分析代码 RQA对离散时间序列进行递归图分析代码 RQA对离散时间序列进行递归图分析代码 RQA对离散时间序列进行递归图分析代码 RQA对离散时间序列进行递归图分析代码 RQA对离散时间...
递归实现回文判断
斐波那契递归时间和非递归时间的比较(csdn)————程序
二叉树递归非递归遍历(递归前中后,非递归前中后,层次遍历)
kettle递归循环,循环结果集,将结果集中的某个字段作为下个转换的参数
MATLAB源码集锦-RQA对离散时间序列进行递归图分析
省市县递归函数
c++ 递归 阶乘 n!c++ 递归 阶乘 n!c++ 递归 阶乘 n!c++ 递归 阶乘 n!c++ 递归 阶乘 n!c++ 递归 阶乘 n!c++ 递归 阶乘 n!c++ 递归 阶乘 n!c++ 递归 阶乘 n!c++ 递归 阶乘 n!c++ 递归 阶乘 n!c++ 递归 阶乘...
宏递归宏递归宏递归宏递归宏递归宏递归宏递归宏递归宏递归宏递归
1.建立完全二叉树 2.先序非递归遍历二叉树函数 & 先序递归遍历二叉树验证 3.中序非递归遍历二叉树函数 & 中序递归遍历二叉树验证 4.后序非递归遍历二叉树函数 & 后序递归遍历二叉树验证
C#递归C#递归C#递归C#递归C#递归C#递归C#递归C#递归C#递归
算法时间复杂度分析中递归方程求解方法综述
该脚本可以扫描指定路径,将符合条件的文件全部找出。你可以添加自己的函数来处理符合条件的文件。如删除某个文件夹里的所有特定文件
一是已知递归函数(其中DIV为整除),当n=0时,F(n)=1; 当n>0时, F(n)=n*F(nDIV2);(1)编写求F(n)的递归算法fun1(n),(2)采用循环消除递归法fun1(n)求F(n)的值。 二是稀疏矩阵的操作,基本功能要求:稀疏矩阵采用...
递归图(reecurrence plots),从相空间重构时间序列的matlab程序,
文件递归-XML递归-树图递归 面试中的常见递归算法:附带截图和详细代码
7. 递归算法和循环算法在斐波那契数列计算中的应用:递归算法的时间复杂度为 O(2^n),循环算法的时间复杂度为 O(n)。 8. 递归算法和循环算法在二分查找算法中的应用:递归算法和循环算法的时间复杂度都为 O(logn),...
java Java中的递归 java Java中的递归
递归处理css文件中的@import,自动合并为一个css文件。 Features 支持 css样式文件 支持 @import 递归处理 支持线上的import url 自动下载再合并 Usage var gulp = require('gulp'); var coimport = require('./...
递归在计算学科中是一种非常重要的方法,计算理论中到处都有用递归进行表述的问题及求解方法。 在程序设计中,数据描述和算法表达也常用递归,通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题...