`

表单验证中时间起止判断的递归处理

    博客分类:
  • js
阅读更多

在最近一个项目中,表单验证需要对时间的起止范围进行判断:结束时间需大于或等于开始时间。即:结束年须大于起始年;如果相等,则比较起始月与结束月;如果起止月也相等,则比较日期。那么,对于每一次验证,可以用下面这个函数来进行比较。

  1. function compare(begin,end,error){
  2.   var begin = parseInt(begin,10);
  3.   var end = parseInt(end,10);
  4.   var diff = end - begin;
  5.   if(diff < 0){
  6.       alert(error);
  7.   }else{
  8.       return true;
  9.   }
  10. }

这样,在验证的时候,只要结果返回真就表示通过。如:

  1. var year = compare(2001,2003,'年');
  2. var month = compare(1,2,'月');
  3. var day = compare(12,13,'天');
  4. alert(year && month && day); //结果为真------"true"

将上面的起止月份和起止日期修改一下。如:

  1. var year = compare(2001,2003,'年');
  2. var month = compare(3,2,'月');
  3. var day = compare(24,13,'天');
  4. alert(year && month && day); /结果为假------"false"

执行结果,依次显示”月”,”天”,”false”;实际上,当起止月份不正确的时候,我们没必要对日期进行验证;月份验证的前提条件是年验证通过;天验证的前提是月份验证通过。仔细分析之后,我决定将上面函数的三个参数用单体模式存储起来,即:

  1. {
  2.   begin:2001,
  3.   end:2003,
  4.   error:"结束年限须大于起始年限"
  5. }

但是,我又不想定义函数的参数,函数能否根据传递的参数自动进行验证了?答案是肯定的。在函数的开始,先判断参数的个数,如果大于1,则含有递归处理。如何做到递归处理呢?我在函数内部作了如下处理:

  1. var len = arguments.length;
  2. if(len > 1){
  3.   var args = Array.prototype.slice.call(arguments);
  4.   args.shift(); //将第一个参数移除,余下的用作递归处理的参数
  5. }

对于arguments,我们不能直接调用Array.shift()方法。虽然 arguments有length属性,但毕竟不是数组,所以用Array.slice()方法将其转换成数组。关于arguments,在网上可以了解到更多的信息,这里不在赘述。为什么只有在len大于1时才进行处理呢?因为参数为1时,就不需要进行下一步验证了。递归处理在什么时候进行呢?仔细想想,只有在初始值与结束值相等时才需要,明白了这些,我们就很容易构建我们的验证函数了。

  1. var diff = parseInt(arguments[0].end,10) - parseInt(arguments[0].begin,10);
  2. if(diff <0 ){
  3.   alert(arguments[0].error);
  4.   return false;
  5. }else if(diff == 0){
  6.   return len > 1 ? arguments.callee.apply(this,args) : true;
  7. }else{
  8.   return true;
  9. }
复制代码

上面的代码中,arguments.callee是函数自身,关于apply的用法可以在web查找相关资料。

  1. function compare(){
  2.   var len = arguments.length;
  3.   if(len > 1){
  4.       var args = Array.prototype.slice.call(arguments);
  5.       args.shift(); //将第一个参数移除,余下的用作递归处理的参数

  6.   }
  7.   var diff = parseInt(arguments[0].end,10) - parseInt(arguments[0].begin,10);
  8.   if(diff <0 ){
  9.       alert(arguments[0].error);
  10.       return false;
  11.   }else if(diff == 0){
  12.       return len > 1 ? arguments.callee.apply(this,args) : true;
  13.   }else{
  14.       return true;
  15.   }
  16. }
复制代码

到此验证函数已经完成,但需要注意的是:

 1. 虽然没有确定参数的个数,但参数的顺序还是重要的,因为前一个参数的验证结果决定了下一个参数的验证是否继续;
 2. parseInt()函数的第二个参数10不要忽略。如果忽略,当遇到以0开始的数值(如07、08)时将会按八进制进行处理。

到此已经结束,看看 示例 。有时候,我们不想以alert的方式显示错误信息,我们可以自定义处理函数将其作为最后一个参数传入其中。那么在函数的开始,取得处理函数,如:

  1. var func = arguments[len - 1];
  2. if(typeof func  ==  'function'){
  3. func(arguments[0]);
  4. }
复制代码

所以,最终的处理函数是这样的:

  1. function compare(){
  2.   var len = arguments.length;
  3.   var func = arguments[len - 1];
  4.   if(len > 1){
  5.       var args = Array.prototype.slice.call(arguments);
  6.       args.shift(); //将第一个参数移除,余下的用作递归处理的参数
  7.   }
  8.   var diff = parseInt(arguments[0].end,10) - parseInt(arguments[0].begin,10);
  9.   if(diff <0 ){
  10.       (typeof  func  ==  'function') ? func(arguments[0].error) : alert(arguments[0].error);
  11.       return false;
  12.   }else if(diff == 0){
  13.       return len > 1 ? arguments.callee.apply(this,args) : true;
  14.   }else{
  15.       return true;
  16.   }
  17. }
分享到:
评论

相关推荐

    代码 RQA对离散时间序列进行递归图分析

    代码 RQA对离散时间序列进行递归图分析代码 RQA对离散时间序列进行递归图分析代码 RQA对离散时间序列进行递归图分析代码 RQA对离散时间序列进行递归图分析代码 RQA对离散时间序列进行递归图分析代码 RQA对离散时间...

    kettle递归循环(脚本判断)

    在"Kettle递归循环(脚本判断)"这个主题中,我们将深入探讨如何在Kettle中实现递归循环,以及如何利用脚本判断来控制这些循环。 首先,递归循环在Kettle中通常通过工作流(Job)和转换(Transformation)的相互调用...

    javascript表单验证器三方库.zip

    递归验证意味着它可以处理嵌套的复杂数据结构,比如JSON对象中的数组或对象,这对于现代Web应用中常见的复杂表单数据处理非常有用。 在使用这个验证库时,开发者可以定义自定义验证规则,也可以利用预设的验证函数...

    jQuery表单验证实例代码

    在本文中,我们将深入探讨如何使用jQuery进行表单验证,主要基于给定的"jQuery表单验证实例代码"。jQuery库简化了JavaScript的DOM操作,使得表单验证变得更加容易和直观。以下是一些关于这个主题的关键知识点: 1. ...

    递归实现回文判断

    根据给定的文件信息,我们可以总结出以下关于“递归实现回文判断”的知识点: ### 一、回文概念 回文是指一个字符串从左到右读和从右到左读都是一样的字符串。例如,“abcba”、“madam”等都是回文字符串。 ### ...

    递归图 时间序列重构小波变换_递归图matlab_reconstitution_recurrenceplots_小波变换_递归图

    小波变换是另一种处理时间序列的重要工具,它能同时在时间和频率域上提供局部化分析。在递归图的应用中,小波变换常用于预处理,如降噪或特征提取。通过小波分解,我们可以将时间序列分解为不同尺度的细节和平均成分...

    斐波那契递归时间和非递归时间的比较(csdn)————程序.pdf

    在这个文档中,作者比较了两种计算斐波那契数列的方法:递归和非递归(也称为迭代)。递归方法通常更直观,但效率较低,而迭代方法虽然稍显复杂,但在处理大数时更有效率。 递归算法是通过调用自身来解决问题的。在...

    可并行递归算法的递归多线程实现

    例如,快速排序算法,一个经典的递归算法,可以通过并行处理两个子数组的排序过程,从而大幅减少排序所需的时间。 #### 实现细节:可并行的尾递归算法与多线程 快速排序算法通常遵循“分而治之”的策略,将数组...

    算法时间复杂度分析中递归方程求解方法综述

    ### 算法时间复杂度分析中递归方程求解方法综述 #### 引言 在计算机科学领域,递归是一种常见的编程思想和技术,它不仅被广泛应用于各种算法的设计之中,也是评估算法效率的重要工具之一。递归方程在算法的时间...

    C#递归 C#递归 C#递归

    根据给定的信息,本文将详细解释C#中的递归概念,并通过具体的代码示例来解析递归函数在构建树形结构中的应用。 ### C#递归基础 #### 什么是递归? 递归是一种编程技术,它允许一个方法或函数直接或间接地调用自身...

    RQA对离散时间序列进行递归图分析.rar

    在本压缩包“RQA对离散时间序列进行递归图分析.rar”中,主要包含的是使用MATLAB语言实现的针对离散时间序列的一种高级分析方法——递归网络(Recurrence Plot, RP)和相关质量指标(Recurrence Quantification ...

    Chomsky文法类型判断及消除文法的左递归.txt

    根据提供的文件内容,本文将详细解释Chomsky文法类型的判断方法、如何消除文法中的左递归,以及代码实现的各个部分。 ### Chomsky文法类型判断及消除文法的左递归 #### 一、Chomsky文法类型简介 Chomsky将形式语言...

    MATLAB源码集锦-RQA对离散时间序列进行递归图分析

    MATLAB源码集锦-RQA对离散时间序列进行递归图分析

    省市县递归函数

    省市县递归函数

    java 中的经典递归

    ### Java中的经典递归 #### 一、递归的基本概念 递归是一种常见的算法思想,在计算机科学中占有重要地位。简单来说,递归是指在函数的定义或执行过程中调用自身的方法。递归通常用于解决那些可以分解为相似子问题...

    递归程序

    在编程领域,递归是一种...`js` 文件中的代码可能展示了如何在实际项目中应用递归,例如在数据验证或处理分层数据结构的场景中。结合`validator.html`,我们可以推测这个应用可能是一个使用递归进行表单验证的实例。

    非递归遍历完全二叉树 & 递归遍历完全二叉树

    非递归实现通常需要借助栈来模拟递归过程,首先将根节点压入栈中,然后循环处理栈顶元素,直到栈为空。 2. **中序遍历**:中序遍历的顺序是左子树 -&gt; 根节点 -&gt; 右子树。在递归版本中,我们首先对左子树进行中序...

    关于递归算法时间复杂度分析的探讨.pdf

    这是因为递归算法中的多次函数调用会带来额外的时间和空间开销,尤其是在递归层数较多的情况下。非递归算法往往能更高效地利用资源,减少不必要的计算和存储需求。 综上所述,虽然递归算法提供了强大的问题解决能力...

    ava中的递归的资源

    在Java编程语言中,递归是一种强大的编程技术,它指的是函数或方法调用自身的过程。递归可以帮助我们解决复杂的问题,通过将大问题分解为更小的子问题来简化问题解决。本文将深入探讨Java中递归的概念、工作原理、优...

    ruby脚本递归处理指定路径下的文件

    该脚本可以扫描指定路径,将符合条件的文件全部找出。你可以添加自己的函数来处理符合条件的文件。如删除某个文件夹里的所有特定文件

Global site tag (gtag.js) - Google Analytics