JavaScript相关对象方法扩展

(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,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/ /g,"&nbsp;").replace(/\'/g,"&#39;").replace(/\"/g,"&quot;");
		},
		//字符串解码
		decode:function(){
			return this.replace(/&amp;/g,"&").replace(/&lt;/g,"<").replace(/&gt;/g,">").replace(/&nbsp;/g," ").replace(/&#39;/g,"\'").replace(/&quot;/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);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值