博客园 :: 首页 ::  ::  ::  :: 管理

都是基于 String.prototype 的扩展:

 起因是有个网友和我讨论两个函数,

一个是 isDateTime (判断字符是否是符合 yyyy-mm-dd hh:mm:ss日期格式)
另一个是 left 函数,类似vbscript的left 实现中英文字符的混合截取。

他两个函数都用了循环,还用了N多 if 语句,每个函数都超过了40行代码,问我有无好的办法精简一下。
于是,我就写出了下面的代码,不敢说最效率最高,但是已经是够精简了, left函数才1行

 1 <script type="text/javascript">
 2 
 3 //by Go_Rush(阿舜) from http://ashun.cnblogs.com/
 4 
 5 function $A(arrayLike){
 6     for(var i=0,ret=[];i<arrayLike.length;i++) ret.push(arrayLike[i])
 7     return ret
 8 };
 9 Array.prototype.any=function(f){
10     for(var i=0;i<this.length;i++if (f(this[i],i,this)) return true;
11     return false
12 };
13 
14 
15 
16 //判断 字符串 是否符合 yyyy-mm-dd hh:mm:ss的日期格式, 格式正确而且闰年闰月等也要正确
17 
18 String.prototype.isDateTime=function(){  
19     try{
20         var arr=(this.length==19)?this.split(/\D/):[]
21         --arr[1]
22         eval("var d=new Date("+arr.join(",")+")")    
23         return     Number(arr[0])==d.getFullYear() && Number(arr[1])==d.getMonth() 
24                      && Number(arr[2])==d.getDate() && Number(arr[3])==d.getHours()
25                     && Number(arr[4])==d.getMinutes() && Number(arr[5])==d.getSeconds()
26     }catch(x){return false}
27 }
28 
29 /*
30 alert("2002-12-12 10:10:40".isDateTime())  //true
31 alert("2002-02-31 10:10:40".isDateTime())  //false
32 alert("2002-22-31 10:10:40".isDateTime())  //false
33 alert("2002-22-31 30:10:40".isDateTime())  //false
34 */
35 
36 
37 // 检查 是否以特定的字符串结束
38 String.prototype.startsWith=function(){
39     var _string=this
40     return $A(arguments).any(function(value){return _string.slice(0,value.length)==value})
41 };
42 /*
43 alert("http://www.google.com/".startsWith("http://","ftp://","telnet://"))  //true  满足其中任何一个就返回 true
44 alert("http://www.google.com/".startsWith("https://","file://"))  //false
45 alert("abc".startsWith("a"))  //true
46 */
47 
48 
49 // 检查 是否以特定的字符串结束
50 String.prototype.endsWith=function(){
51     var _string=this
52     return $A(arguments).any(function(value){return _string.slice(value.length*(-1))==value})
53 };
54 
55 
56 
57 //从左边截取n个字符 ,如果包含汉字,则汉字按两个字符计算
58 String.prototype.left=function(n){
59     return this.slice(0,n-this.slice(0,n).replace(/[\x00-\xff]/g,"").length)
60 };
61 /*
62 alert("abcdefg".left(3)==="abc")
63 alert("中国人cdefg".left(5)==="中国")
64 alert("中国abcdefg".left(5)==="中国a")
65 */
66 
67 
68 
69 
70 //从右边截取n个字符 ,如果包含汉字,则汉字按两个字符计算
71 String.prototype.right=function(n){
72     return this.slice(this.slice(-n).replace(/[\x00-\xff]/g,"").length-n)
73 };
74 
75 /*
76 alert("abcdefg".right(3)==="efg")
77 alert("cdefg中国人".right(5)==="国人")
78 alert("abcdefg中国".right(5)==="g中国")
79 */
80 
81 </script>
0
0
(请您对文章做出评价)
« 上一篇:无语,javascript居然支持中文(unicode)编程!
» 下一篇:怎样写一个通用的JavaScript效果库!(1/2)

Feedback

#1楼   回复  引用  查看    

2006-12-28 20:42 by Wisdom-zh      
good

#2楼   回复  引用    

2007-01-15 10:13 by misshjn[未注册用户]
怎么好久没有新文章了?我是天天都来啊,期待。。。。

#3楼   回复  引用  查看    

2007-07-17 11:39 by 冬冬      
我的日期、时间判断Js:
    IsDate : function(op, formatString){
        formatString 
= formatString || "ymd";
        
var m, year, month, day;
        
switch(formatString){
            
case "ymd" :
                m 
= op.match(new RegExp("^((\\d{4})|(\\d{2}))([-./])(\\d{1,2})\\4(\\d{1,2})$"));
                
if(m == null ) return false;
                day 
= m[6];
                month 
= m[5]*1;
                year 
=  (m[2].length == 4? m[2] : GetFullYear(parseInt(m[3], 10));
                
break;
            
case "dmy" :
                m 
= op.match(new RegExp("^(\\d{1,2})([-./])(\\d{1,2})\\2((\\d{4})|(\\d{2}))$"));
                
if(m == null ) return false;
                day 
= m[1];
                month 
= m[3]*1;
                year 
= (m[5].length == 4? m[5] : GetFullYear(parseInt(m[6], 10));
                
break;
            
default :
                
break;
        }

        
if(!parseInt(month)) return false;
        month 
= month==0 ?12:month;
        
var date = new Date(year, month-1, day);
        
return (typeof(date) == "object" && year == date.getFullYear() && month == (date.getMonth()+1&& day == date.getDate());
        
function GetFullYear(y){return ((y<30 ? "20" : "19"+ y)|0;}
    }
,
    IsTime : 
function(op, formatString){
        
        
var hour, minute, second = 0 * 1;
        
var m;
        
        m 
= op.match(new RegExp("^(\\d{1,2})([:./])(\\d{1,2})$"));
        
if(m == null || m.length == 0) m = op.match(new RegExp("^(\\d{1,2})([:./])(\\d{1,2})([:./])(\\d{1,2})$"));
        
if(m == null || m.length == 0return false;
        
        hour 
= m[1* 1;
        minute 
= m[3* 1;
        
if(m.length == 6) second = m[5* 1;

        
if(parseInt(hour, 10== NaN) return false;
        
if(!parseInt(minute, 10== NaN) return false;
        
if(!parseInt(second, 10== NaN) return false;
        
        hour 
= hour == 24 ? 0 : hour;
        
        
return (hour >=0 && hour < 24 && minute >=0 && minute < 60 && second >=0 && second < 60); 
    }
,
    IsDateTime : 
function(op, formatString){
    
        
var date, time;    
        
var opArray = op.split(' ');
        
        date 
= opArray[0];        
        
if(!this.IsDate(date)) return false;
        
        
if(opArray.length = 1return true;
        
        time 
= opArray[1];
        
if(!this.IsTime(time)) return false;
    }

#4楼   回复  引用    

2008-04-13 13:02 by iAlvin[未注册用户]
String.prototype.left 不正确吧

alert("32中国人啊人啊abcdefg".left(6));
出了个 "32"