(function(){
var to_string=Object.prototype.toString, js_type="Boolean|Number|String|Function|Array|Date|RegExp|Object".split("|"), jsTypes={
types:(function(){for(var i = 0,o={};i<js_type.length;o['[object '+js_type[i]+']']=js_type[i],i++);return o;}()),
type:function(o){return o==null?String(o):jsTypes.types[to_string.call(o)] || 'object'},
fn:function(f){return jsTypes.type(f)==='Function'},
bool:function(b){return jsTypes.type(b)==='Boolean';},
num:function(n){return jsTypes.type(n)==='Number';},
array:function(a){return jsTypes.type(a)==='Array';},
date:function(d){return jsTypes.type(d)==='Date';},
reg:function(r){return jsTypes.type(r)==='RegExp';},
string:function(s){return jsTypes.type(s)==='String';}
},ext_=function(extObj,obj){for(var k in obj)extObj[k]=obj[k];};
//Object extend
ext_(Object,{
//注册一个对象
register:function(str,i,o){
for(i=0,o=window,str=str.split('.');i<str.length;i++)o=o[str[i]]||(o[str[i]]={}); return o;
},
//获取一个对象
getObj:function(str,o,i){
for(i=0,o=o||window,str=str.split('.');o&&i<str.length;i++) o=o[str[i]]; return o;
}
});
//Object prototype extend
ext_(Object.prototype,{
//获取某个对象的所有key值
keys:function(){
var ret=[];
for(var k in this) ret.push(k);return ret;
},
//获取某个对象的所有value值
values:function(){
var ret=[];
for(var k in this) ret.push(this[k]);return ret;
},
//获取某个对象的所有key/value值
entrySet:function(){
var ret=[];
for(var k in this) ret.push({key:k,value:this[k]});return ret;
},
//某个对象是否包含某个key
containKey:function(k){
for(var key in this) if(key==k) return true; return false;
},
//某个对象是否包含某个value
containValue:function(v){
for(var key in this) if(this[key]==v) return true; return false;
}
});
//Array prototype extend
ext_(Array.prototype,{
//过滤数组元素,返回新数组
filter:function(fn){
for(var i=0, ret=[];i<this.length;i++) fn.call(this[i],this[i],i,this)!==false && ret.push(this[i]); return ret;
},
//将复杂的数组转换为一个一维的数组,如:[1,[2,[3,[4]]]].oneArray();[1,2,3,4]
oneArray:function(){
for(var i=0,ret=[];i<this.length;i++) ret=ret.concat(this[i] instanceof Array ? this[i].oneArray() : this[i]); return ret;
},
//数组中是否包含指定的值,如:[].contain(1),[].contain(1,2),[].contain(1,[2,[3,[4]]])
contain:function(){
for(var i=0,arg=Array.argsArray(arguments).oneArray();i<this.length;i++) for(var j=0;j<arg.length;j++) if(arg[j]==this[i]) return true;return false;
},
//在数组中的每个项上运行一个函数,当f为true时,每个元素都会调用fn,当f不为true时,当其中某个元素调用fn返回false时则结束循环,i为从第i个元素开始循环;其中f和i可以调换参数位置;如:[1,2,3,4,5,6].each(function(e,i,arr){ console.log(i+"="+e); return e<4;});[1,2,3,4,5,6].each(function(e,i,arr){ console.log(i+"="+e); return e<4;},true)
each:function(fn,f,i,t){
for(jsTypes.num(f)?(t=f,f=i,i=t):(!jsTypes.num(i)&&(i=0));i<this.length;i++) fn(this[i],i,this)===false && f!==true && (i=this.length);
},
//检查数组元素是否都符合某个条件,只要有一个不符合返回false,否则返回true
every:function(fn){
for(var i=0, r=true;r && i<this.length;i++) fn.call(this[i],this[i],i,this)===false && (r=false); return r;
},
//检查数组中元素是否符合某个条件,只要有一个符合返回true,否则返回false
some:function(fn){
for(var i=0, r=false; !r && i<this.length;i++) fn.call(this[i],this[i],i,this)===true && (r=true); return r;
},
//在数组中的每个项上运行一个函数,并将全部结果作为数组返回
map:function(fn){
for(var i=0, ret=[]; i<this.length;i++) ret.push(fn.call(this[i],this[i],i,this)); return ret;
},
//从数组中获取某个值对应的索引,['a','b','c'].indexOf('b'),['a','b','c'].indexOf('b',1),['a','b','c'].indexOf('b',-2),['a','b','c'].indexOf('b',-100)
indexOf:function(v, i, l){
for(l=this.length,i=i<0?l+i:i>-1?i:0,i=i<0?0:i; i<l; i++)if(this[i]===v)return i;return -1;
},
//将执行函数时传递的参数arguments转换为数组.
argsArray:Array.argsArray=function(args){
for(var i=0,ret=[];i<args.length;i++)ret.push(args[i]);return ret;
}
});
//Number prototype extend
ext_(Number.prototype,{
//将数字转换为人民币(大写汉字)
rmbUpperCase:function(){
}
});
//Date prototype extend
ext_(Date.prototype,{
//将日期按照指定格式输出
format:function(fmt){
},
toJSON:function(i){
return (i=-1,(this.getFullYear()+'-'+(this.getMonth()+1)+'-'+this.getDate()+'T'+this.getHours()+':'+this.getMinutes()+':'+this.getSeconds()+'.'+this.getMilliseconds()).replace(/(\d+)/g,function(e){return (i++,('00'+e).substr(i==0?-4:i==6?-3:-2))}));
},
toString: function(){
return this.toJSON();
}
});
//String prototype extend
ext_(String.prototype,{
//按照{n}的形式替换字符串,如:"{0}({1}),你好,我今年{2}岁了。".formatValue('Hello','小朋友',12)
formatValue:function(){
var arg=arguments;
return this.replace(/\{(\d+)\}/g,function(s,i,str){
return arg[i]||s;
});
},
//按照{n}的形式替换字符串,如:"{0}({1}),你好,我今年{2}岁了。".formatValue('Hello','小朋友',12)
formatEncode:function(){
var arg=arguments;
return this.replace(/\{(\d+)\}/g,function(s,i,str){
return (arg[i]||s).encode();
});
},
//重复复制字符串,如:"abc".copy(3)
copy:function(n){
return Array(n+1).join(this);
},
//字符串转码
encode:function(){
return this.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/ /g," ").replace(/\'/g,"'").replace(/\"/g,""");
},
//字符串解码
decode:function(){
return this.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/ /g," ").replace(/'/g,"\'").replace(/"/g,"\"");
},
//获取字符串长度,ascii不在[0,128]之间的字符,按照指定的长度(默认2)计算总长度
getLength:function(l){
for(var i=0,c=-1,ret=0;i<this.length;i++)
//ret+=(c=this.charCodeAt(i))>=0 && c<=128 ? 1 : (l||2);
ret+=(c=escape(this.charAt(i))) && c.indexOf('%u',0)!=-1 ? 1 : (l||2);
return ret;
},
//字符串反转
reverse:function(){
return this.split("").reverse().join("");
},
//从字符串中获取相应的国际化文字信息,"zh_CN=中文,zh_TW=中文繁体,en_US=英文,ja_JP=日文,it_IT=意大利文,de_DE=德文".getI18n('ja_JP')
getI18n:function(l){
var lang='zh_CN|zh_TW|en_US|ja_JP|it_IT|de_DE'.split('|'),reg=RegExp(',* *('+lang.join('|')+') *= *','g'),retObj={},arr=this.split(reg),arr0=(arr.length%2==1?arr.shift():'');
for(var i = 0; i<arr.length;i++)retObj[arr[i]]=arr[++i];
retObj.hasOwnProperty && lang.forEach(function(e,i,a){!retObj.hasOwnProperty(e) && (retObj[e]=arr0)});
return retObj[l||'zh_CN']||'';
},
toDateTime:function(){
return this.toDate();
},
toDate:function(){
var retDate=null,str=this.trim(),isDate=function(){return retDate instanceof Date};
//全数字情况下,调用者若要按照毫秒处理,请自行处理为 new Date(parseInt(字符串)),否则处理方案如下
//6位全数字,谷歌处理为年份,IE则报错,这里统一处理为yyyyMM
if(/^\d{4}$/g.test(str)){
return new Date(str);
} else if(/^\d{6,17}$/g.test(str)){
//按照yyyyMMddHHmmssSSS的形式处理,根据位数,自动按照[年月日时分秒毫秒]的顺序处理,当为奇数位时,优先处理为毫秒数,如2016014表示2016年14毫秒,并非2016年1月4日
var i=0,s=[],str=str.replace(/(^\d{4})|(\d{3}$)|(\d{2})/g,function(_){s[_.length==3?6:i++]=_});
return new Date(s[0],s[1]||0,s[2]||1,s[3]||0,s[4]||0,s[5]||0,s[6]||0);
//} else if(/^\d{4,8} \d{2,6}(\.d{3})?$/g.test(str)){
} else if(/^\d{5,}$/g) {
return new Date(parseInt(str));
} else if(str.replace(/\D/g,'').length<4) {
//清除非数字,数字位数<4,则返回null
return null;
}
//Date.parse功能已经很强大,已经足够解析各种场景,如果解析不了,再自行解析
try{retDate=new Date(str)} catch(e){}
if(isDate()) return retDate;
debugger;
var arr=[], idx=0, reg=RegExp, rReg="Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec".split('|');
var r=[/(Mon|Tue|Wed|Thu|Fri|Sat|Sun)|([a-zA-Z]{0,3}\+\d{1,2}:?\d{1,2})|(\(.+\))/g, / {2,}/g, reg('('+mReg.join('|')+')','g')];
var rDate=[/(\d{4}([-/]\d{1,2}){2})|((\d{1,2}[-/]){2}\d{4})/g,/(\d{4})/g];
var rTime=[/(\d{1,2}(:\d{1,2}){1,2})/g];
//类似【"Mon Aug 08 2016 22:25:15 GMT+0800 (中国标准时间)","Mon Aug 08 22:25:15 GMT+0800 2016 (中国标准时间)"】的字符串
//将其[星期(Mon),GMT+0800,+0800,UTC+08:00,(中国标准时间)]清除,然后替换英文缩写月份为数字,再次清除两边的非数字字符,最后处理多个空格为一个空格
//最后清除类似"2016-08-06T12:24:45.537+0800"中的T
str=str.replace(r[0],'').replace(r[2],function(s){s="0"+(mReg.indexOf(s)+1);return s.substr(s.length-2)}).replace(/(^\D+)|(\D+$)/g,'').replace(r[1],' ').replace(/\dT\d/g,function(_){return _.replace(/\D/g,' ')});
/*
str=str.replace(/[^0-9-/: \\.]/g,'')
//"6/1 2016 23:12 4 .123 ".replace(/( *[\\.:/-] *)/g,function(s){return s.trim();}).replace(/ {2,}/g,' ')
//.trim();//.replace(/(\dT\d)/g,function(s){return s.replace(/\D/,' ')});
//如果存在英文缩写月份(Aug),且存在符合时间格式的时间,且存在4位数字的年份
if(r[2].test(str) && rTime[0].test(str) && rDate[1].test(str)){
//将[月份,时分秒,年份]处理完后,并替换为空字符串,然后去除多余的空格,剩下的数字则为日
arr[2]=str.replace(r[2],function(s){arr[1]=mReg.indexOf(s)+1;return ''}).replace(rTime[0],function(s){
(s=s.split(':'),arr[3]=s[0],arr[4]=s[1],arr[5]=s[2]);
return '';
}).replace(rDate[1],function(s){arr[0]=s;return ''}).replace(r[1],'');
} else {
//将毫秒提取出来,同时将"2016-08-06T12:24:45.537+0800"中的"6T1"替换为"6 1"
//str=str.replace(/(\.\d{3})/g,function(s){arr[6]=s.substr(1);return ''}).replace(/(\dT\d)/g,function(s){return s.replace(/\D/,' ')});
//str=str.replace(/[^0-9/-: \\.]/g,' ').trim().replace(r[1],' ');
if(rTime[0].test(str)){
(idx=1,str.replace(rTime[0],function(s){
(s=s.split(':'),s[0]>23?(s[1]>23?(arr[3]=s[2],arr[4]=s[0],arr[5]=s[1]):(arr[3]=s[1],arr[4]=s[0],arr[5]=s[2])):(arr[3]=s[0],arr[4]=s[1],arr[5]=s[2]));[[[
return '';
}).replace(/(\d{4})/g,function(s){arr[0]=s;return ''}).replace(/(\d{3})/g,function(s){arr[6]=s;return ''}).replace(/(\d{1,2})/g,function(s){arr[idx++]=s;return ''}));
} else if(rDate[0].test(str)){
str.replace(rDate[0],function(s){
s.length==4?
})
}
}*/
//2016-08-06T12:24:45.537+0800
return new Date(arr[0]||1970,arr[1]&&(arr[1]-1)||0,arr[2]||1,arr[3]||0,arr[4]||0,arr[5]||0,arr[6]||0);
},
//将字符串数字转换为人民币(大写汉字)
rmbUpperCase:function(l){
/*/规律['零','壹','贰','叁','肆','伍','陆','柒','捌','玖']['角','分','厘']['仟','佰','拾','']['万','亿']
空 拾 佰 仟
万 拾万 佰万 仟万
亿 拾亿 佰亿 仟亿
万亿 拾万亿 佰万亿 仟万亿
亿亿 拾亿亿 佰亿亿 仟亿亿
万亿亿 拾万亿亿 佰万亿亿 仟万亿亿
亿亿亿 拾亿亿亿 佰亿亿亿 仟亿亿亿
万亿亿亿 拾万亿亿亿 佰万亿亿亿 仟万亿亿亿
*/
}
});
}())
String.prototype.toDate=function(){
var arr=[],str=this.trim(), reg=RegExp, mReg="Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec".split('|');
var r=[/(Mon|Tue|Wed|Thu|Fri|Sat|Sun)|([a-zA-Z]{0,3}\+\d{1,2}:?\d{1,2})|(\(.+\))/g, / {2,}/g, reg('('+mReg.join('|')+')','g')],setY_S=function(i){
str=str.replace(reg('(\d{'+(i==6?3:4)+'}),'g'),function(){
var arg=arguments,s=arg[0],idx=arg[2],src=arg[arg.length-1];
return (/\d/g.test(src.charAt(idx-1)) || /\d/g.test(src.charAt(idx+s.length)))?s:(arr[i]=s,"");
});
};
//类似【"Mon Aug 08 2016 22:25:15 GMT+0800 (中国标准时间)","Mon Aug 08 22:25:15 GMT+0800 2016 (中国标准时间)"】的字符串
//将其[星期(Mon),GMT+0800,+0800,UTC+08:00,(中国标准时间)]清除,再替换英文缩写月份为数字,然后替换类似"2016-08-06T12:24:45.537+0800"中的T为一个空格,再替换非["数字","-","/"," ",":","."]的其它字符为一个空格,再处理多个空格为一个空格,最后清除两边的空格
str=str.replace(r[0],'').replace(r[2],function(s){s="0"+(mReg.indexOf(s)+1);return s.substr(s.length-2)}).replace(/\dT\d/g,function(_){return _.replace(/\D/g,' ')}).replace(/[^0-9-/: \\.]+/g,' ').replace(r[1],' ').trim();
//全数字情况下,调用者若要按照毫秒处理,请自行处理为 new Date(parseInt(字符串)),否则处理方案如下
//6位全数字,谷歌处理为年份,IE则报错,这里统一处理为yyyyMM
if(/^\d{4}$/g.test(str)){
return new Date(str);
} else if(/^\d{6,17}$/g.test(str)){
//按照yyyyMMddHHmmssSSS的形式处理,根据位数,自动按照[年月日时分秒毫秒]的顺序处理,当为奇数位时,优先处理为毫秒数,如2016014表示2016年14毫秒,并非2016年1月4日
var i=0,s=[];
str.length%2==1?str.replace(/(^\d{4})|(\d{3}$)|(\d{2})/g,function(_){s[_.length==3?6:i++]=_}):str.replace(/(^\d{4})|(\d{2})/g,function(_){s[i++]=_});
return new Date(s[0],s[1]&&s[1]-1||0,s[2]||1,s[3]||0,s[4]||0,s[5]||0,s[6]||0);
}
str=str.replace((/^\d{3}[ .])|([ .]\d{3})|([ .]\d{3}[ .])/g,function(s){arr[6]=s.replace(/\D+/g,'');return ' '}).trim().replace(/ {2,}/g,' ');
str=str.replace((/^\d{4}[ -/])|([ -/]\d{4})|([ -/]\d{4}[ -/])/g,function(s){arr[0]=s.replace(/\D+/g,'');return ' '}).trim().replace(/ {2,}/g,' ');
if(/^\d{6}/g) {
}
debugger;
str=setY_S(0);
str=setY_S(6);
str = str.replace(/([ -/]\d{4})|(\d{4}[ -/])/g,function(s){arr[0]=s.replace(/\D+/g,'');return ''});//年份
str = str.replace(/([ .]\d{3})|(\d{3}[ .])/g,function(s){arr[6]=s.replace(/\D+/g,'');return ''});//毫秒
str = str.replace(/(\d{2}(:\d{2}){1,2})/g,function(s){s=s.split(':');arr[3]=s[0];arr[4]=s[1];arr[5]=s[2];return ''}).replace(r[1],' ');//时分秒
str = str.split(/[ -/:.]/g);
for(var i=0,n;i<8;i++){
while(!arr[i] && !isNaN(n=str.shift()))arr[i]=n;
}
return new Date(arr[0]||1970,arr[1]&&(arr[1]-1)||0,arr[2]||1,arr[3]||0,arr[4]||0,arr[5]||0,arr[6]||0);
}
JavaScript相关对象方法扩展
最新推荐文章于 2022-09-15 16:29:38 发布