免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2927 | 回复: 1
打印 上一主题 下一主题

JavaScript字符串格式化输出 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-03-29 12:46 |只看该作者 |倒序浏览
JavaScript字符串格式化输出




js过程中常常会用到字符串拼接,很多时候这些拼接又长又硬,而js又没有提供像其他语言一样的字符串格式化方式,于是我们只好DIY了。

一般来说,我们需要实现如下两种方式的格式化:
  1. "{0},{1},hehe".format("hello","world")  
复制代码
"数学={数学},语文={语文},hou".format({"数学":100,"语文":95})
第一种是常规的格式化方法 ,很多语言中常见。第二种就不那么常见了 ,但是在Js中却很重要,特别是在ajax交互式后我们返回一堆的json数据。当然有很多人都写过兼容的format写法,但我们今天要尝试另外一些方法。

仔细观察上面的2中格式话方法,我们发现方法签名相同,但参数有所不同。不正好用到JavaScript函数重载模拟一文中的方法重载么?那么就应该有如下的实现:
  1. sm.Overload("format",String.prototype,{  

  2.     "string,string,string...." : function(a,b,c,....){  

  3.                   //pass  

  4.                },  

  5.     "object" : function(param){  

  6.                   //pass  

  7.                 }  

  8. });
复制代码
写完之后发现有点纠结,我们的Overload方法是根据fn_obj对象的键值(如上面代码的"string,string,string....")来给定相对的实现的,但是string的个数确实不确定的,我们无法用它来当一个确定的键值。

怎么办呢?

很容易! 这一堆的string不就代表一个string集合么?用一个Array表示就行了啊。so...
  1. sm.Overload("format",String.prototype,{  

  2.     "array" : function(params){  

  3.         //params is a array  

  4.     },  

  5.     "object" : function(param){  

  6.         //param is a object  

  7.     }  

  8. });
复制代码
剩下的代码就很好写了:
  1. sm.Overload("format",String.prototype,{  

  2.     "array" : function(params){  

  3.         var reg = /{(\d+)}/gm;  

  4.         return this.replace(reg,function(match,name){  

  5.             return params[~~name];  

  6.         });  

  7.     },  

  8.     "object" : function(param){  

  9.         var reg = /{([^{}]+)}/gm;  

  10.         return this.replace(reg,function(match,name){  

  11.             return param[name];  

  12.         });  

  13.     }  

  14. });
复制代码
调用之:
  1. "{0},{1},hehe".format(["hello","world"]); //hello,world,hehe  
复制代码
"数学={数学},语文={语文},hou".format({"数学":100,"语文":95});//数学=100,语文=95,hou
对函数签名相同参数不同的函数进行方法重载好处显而易见,每一中情况你都可以针对行的写出新的函数,而不是用一大堆的If,else。如果再有其他形式的格式化方式,你只需要用sm.Overload对String.prototype.format进行扩展即可,而不是去一个all方法里添加If。

论坛徽章:
0
2 [报告]
发表于 2011-03-29 17:10 |只看该作者
{:3_199:}
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP