在最近一个项目中,表单验证需要对时间的起止范围进行判断:结束时间需大于或等于开始时间。即:结束年须大于起始年;如果相等,则比较起始月与结束月;如果起止月也相等,则比较日期。那么,对于每一次验证,可以用下面这个函数来进行比较。
- 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对离散时间...
在"Kettle递归循环(脚本判断)"这个主题中,我们将深入探讨如何在Kettle中实现递归循环,以及如何利用脚本判断来控制这些循环。 首先,递归循环在Kettle中通常通过工作流(Job)和转换(Transformation)的相互调用...
递归验证意味着它可以处理嵌套的复杂数据结构,比如JSON对象中的数组或对象,这对于现代Web应用中常见的复杂表单数据处理非常有用。 在使用这个验证库时,开发者可以定义自定义验证规则,也可以利用预设的验证函数...
在本文中,我们将深入探讨如何使用jQuery进行表单验证,主要基于给定的"jQuery表单验证实例代码"。jQuery库简化了JavaScript的DOM操作,使得表单验证变得更加容易和直观。以下是一些关于这个主题的关键知识点: 1. ...
根据给定的文件信息,我们可以总结出以下关于“递归实现回文判断”的知识点: ### 一、回文概念 回文是指一个字符串从左到右读和从右到左读都是一样的字符串。例如,“abcba”、“madam”等都是回文字符串。 ### ...
小波变换是另一种处理时间序列的重要工具,它能同时在时间和频率域上提供局部化分析。在递归图的应用中,小波变换常用于预处理,如降噪或特征提取。通过小波分解,我们可以将时间序列分解为不同尺度的细节和平均成分...
在这个文档中,作者比较了两种计算斐波那契数列的方法:递归和非递归(也称为迭代)。递归方法通常更直观,但效率较低,而迭代方法虽然稍显复杂,但在处理大数时更有效率。 递归算法是通过调用自身来解决问题的。在...
例如,快速排序算法,一个经典的递归算法,可以通过并行处理两个子数组的排序过程,从而大幅减少排序所需的时间。 #### 实现细节:可并行的尾递归算法与多线程 快速排序算法通常遵循“分而治之”的策略,将数组...
### 算法时间复杂度分析中递归方程求解方法综述 #### 引言 在计算机科学领域,递归是一种常见的编程思想和技术,它不仅被广泛应用于各种算法的设计之中,也是评估算法效率的重要工具之一。递归方程在算法的时间...
根据给定的信息,本文将详细解释C#中的递归概念,并通过具体的代码示例来解析递归函数在构建树形结构中的应用。 ### C#递归基础 #### 什么是递归? 递归是一种编程技术,它允许一个方法或函数直接或间接地调用自身...
在本压缩包“RQA对离散时间序列进行递归图分析.rar”中,主要包含的是使用MATLAB语言实现的针对离散时间序列的一种高级分析方法——递归网络(Recurrence Plot, RP)和相关质量指标(Recurrence Quantification ...
根据提供的文件内容,本文将详细解释Chomsky文法类型的判断方法、如何消除文法中的左递归,以及代码实现的各个部分。 ### Chomsky文法类型判断及消除文法的左递归 #### 一、Chomsky文法类型简介 Chomsky将形式语言...
MATLAB源码集锦-RQA对离散时间序列进行递归图分析
省市县递归函数
### Java中的经典递归 #### 一、递归的基本概念 递归是一种常见的算法思想,在计算机科学中占有重要地位。简单来说,递归是指在函数的定义或执行过程中调用自身的方法。递归通常用于解决那些可以分解为相似子问题...
在编程领域,递归是一种...`js` 文件中的代码可能展示了如何在实际项目中应用递归,例如在数据验证或处理分层数据结构的场景中。结合`validator.html`,我们可以推测这个应用可能是一个使用递归进行表单验证的实例。
非递归实现通常需要借助栈来模拟递归过程,首先将根节点压入栈中,然后循环处理栈顶元素,直到栈为空。 2. **中序遍历**:中序遍历的顺序是左子树 -> 根节点 -> 右子树。在递归版本中,我们首先对左子树进行中序...
这是因为递归算法中的多次函数调用会带来额外的时间和空间开销,尤其是在递归层数较多的情况下。非递归算法往往能更高效地利用资源,减少不必要的计算和存储需求。 综上所述,虽然递归算法提供了强大的问题解决能力...
在Java编程语言中,递归是一种强大的编程技术,它指的是函数或方法调用自身的过程。递归可以帮助我们解决复杂的问题,通过将大问题分解为更小的子问题来简化问题解决。本文将深入探讨Java中递归的概念、工作原理、优...
该脚本可以扫描指定路径,将符合条件的文件全部找出。你可以添加自己的函数来处理符合条件的文件。如删除某个文件夹里的所有特定文件