js 实现 C# 的 format 方法

2014-11-08 12:18:51 更新,修复原形链方法被看成关键词的bug,其实以前是想用全局关键词的,不过仍是算了,array里有太多单词了。
                                如今 length callee 关键词依然会被输出,之后修复,如今为了精简就将就着用了。
2014-08-26 14:55:30 更新,修复 #5楼 冲动 兄弟提出的问题。javascript

其实我根本不会 C# 只是看到人家写了个这种功能《js实现相似c#中的字符串处理方法format()
我看了下代码,以为思路繁琐,因此简化思路写一个同样的功能的方法,和你们分享下思路。php

先来看下代码吧。html

String.prototype.format = function(args) { var _dic = typeof args === "object" ? args : arguments; return this.replace(/\{([^{}]+)\}/g, function(str, key) { // return key in _dic ? _dic[key] : str; return _dic.hasOwnProperty(key) ? _dic[key] : str; }); } var str = "参数{0}参数{1}参数{2}参数{3}参数{hehe}参数{{fuck}}参数{ooxx}"; console.log( str.format("001", "002") ); // 参数001参数002参数{3}参数{hehe}参数{{fuck}}参数{ooxx} console.log( str.format(["001", "002"]) ); // 参数001参数002参数{3}参数{hehe}参数{{fuck}}参数{ooxx} console.log( str.format([null, "", undefined, 1]) ); // 参数null参数参数undefined参数1参数{hehe}参数{{fuck}}参数{ooxx} console.log( str.format({hehe: "呵呵", fuck: "法克"}) ); // 参数{0}参数{1}参数{3}参数呵呵参数{法克}参数{ooxx} console.log( str.format({"1":"111", hehe: "呵呵", ooxx: "哈哈"}) ); // 参数{0}参数111参数{3}参数呵呵参数{{fuck}}参数哈哈 console.log( str.format({"1":undefined, hehe: null, ooxx: ""}) ); // 参数{0}参数undefined参数{2}参数{3}参数null参数{{fuck}}参数

代码简洁易懂,维护起来也很轻松,并且支持 3 种格式的参数替换。
可是也不是无懈可击的,由于个人思路和原文彻底相反。java

思路是这样的,利用正则匹配出字符串内全部 {key} 这样的格式字符,而后把 key 看成对象对应的key或者数组对应的下标进行替换。
第一行  var _dic = typeof args === "object" ? args : arguments;  能够接受 3 种格式的数据。
多参数: arguments
数组: []
对象: {}
把这3种数据看成字典保存在 _dic 变量里。
c#

下面正则替换替换函数里,其实就是进行查字典操做。
 return key in _dic ? _dic[key] : str; 
若是 _dic[key] 对应数据存在,就替换,不然就返回原始数据。
由于 arguments, [], {} 均可以看成字典来处理,因此就可用最简单方法实现这种效果了。
数组

同时缺陷也很是明确的暴露了,就是若是字符串里 {key} 这种参数很是多,可是替换的数据却不多的时候,性能确定不如他的方法。
但我以为通常操做确定都是参数对应进行替换的,这样性能损耗就不用担忧了,由于对应了参数,损耗就是0。
反而比他那个屡次正则替换来的快呢。函数

相关文章
相关标签/搜索