js 实现 C# 的 format 方法

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

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

先来看下代码吧。

文本运行

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 种格式的参数替换。
但是也不是无懈可击的,因为我的思路和原文完全相反。

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

下面正则替换替换函数里,其实就是进行查字典操作。
 return key in _dic ? _dic[key] : str; 
如果 _dic[key] 对应数据存在,就替换,否则就返回原始数据。
因为 arguments, [], {} 都可以当作字典来处理,所以就可用最简单方法实现这种效果了。

同时缺陷也非常明确的暴露了,就是如果字符串里 {key} 这种参数非常多,但是替换的数据却很少的时候,性能肯定不如他的方法。
但我觉得一般操作肯定都是参数对应进行替换的,这样性能损耗就不用担心了,因为对应了参数,损耗就是0。
反而比他那个多次正则替换来的快呢。

时间: 2024-11-07 02:54:51

js 实现 C# 的 format 方法的相关文章

实现Date函数属性中的format方法

js中没有Date.format方法的,所以在date属性中加format方法 //js格式化属性 Date.prototype.format = function (format) { var o = { "M+": this.getMonth() + 1, //month "d+": this.getDate(), //day "h+": this.getHours(), //hour "m+": this.getMinu

js相关的时间获取方法

1.获取时间 var time=new Date();//返回的是GMT,格林尼治标准时间. console.log(time)://Thu Jul 27 2017 16:55:21 GMT+0800 (中国标准时间). 2.时间戳的定义为从格林威治时间1970年01月01日00时00分00秒起至现在的总秒数 一.js将时间转换成时间戳 1.js获取当前时间戳的方法 方法一.var timestamp1=Date.parse(new Date());//Date.parse() 是 Date 对

我在一个前端项目中用js整理的一些通用方法,其中使用到的思想,主要就是约定了。

把名称和后台来的json数据约定起来,可以达到的效果就是可以将东西统一化,减少差异,提升模块等的通用性,此后就可以实现具体不同模块内容可以自动或拷贝赋值的方式 顺带,这个前端项目中用到的控件,一般是手写,其他类型,比如菜单是  accordion.js这个手风琴控件 /* File Created: 十二月 18, 2014  *@Author iGO *@LastModify 2014-12-19 **/ //使用闭包,为了增加开发效率而写的自动化赋值的类 //todo: string对象 添

JS操作字符串常用的方法

JS操作String对象的方法 charAt(index):返回指定索引处的字符串charCodeAt(index):返回指定索引处的字符的Unicode的值concat(str1,str2,...):连接多个字符串,返回连接后的字符串的副本fromCharCode():将Unicode值转换成实际的字符串indexOf(str):返回str在父串中第一次出现的位置,若没有则返回-1lastIndexOf(str):返回str在父串中最后一次出现的位置,若没有则返回-1match(regex):

String.format()方法使用说明

JDK1.5开始String类中提供了一个非常有用的方法String.format(String format, Object ... args) 查看源码得知其实是调用了Java.util.Formatter.format(String, Object...)方法 [java] view plain copy print? public static String format(String format, Object ... args) { return new Formatter().f

JSF页面中使用js函数回调后台bean方法并获取返回值的方法

由于primefaces在国内使用的并不是太多,因此,国内对jsf做系统.详细的介绍的资料很少,即使有一些资料,也仅仅是对国外资料的简单翻译或者是仅仅讲表面现象(皮毛而已),它们的语句甚至还是错误的,很可能会误导使用者. 相对来说,看国内的那些仅仅是翻译过来的文章或书籍不如直接看国外的官方文档或资料来的实在,在我讲述jsf页面中如何使用js调用后台bean方法之前,先给大家说几个国外的资料.在primefaces官方网站上,你可以搜索到几乎所有你需要的东西,primefaces官网为:http:

node.js 和 node-webkit C++扩展方法

构建node扩展的方法: 1,安装node.js 版本为0.10.24.msi 2,安装node-gyp, npm install -g node-gyp 3,构建 hello工程 cd 到 node-gyp-hello\src node-gyp configure node-gyp build 构建node-webkit扩展的方法: 1,安装node.js 版本为0.10.24.msi 2,安装nw-gyp, npm install -g  nw-gyp 3,构建 hello工程 cd 到 n

测试String.Format方法

今天想使用String.Format,和平时的用法不一样. 直接上代码: [Test] public void TestMethod6() { string A = "A"; string B = "B"; string C = "C"; string D = "{0}"; String str = String.Format(D, A, B, C); Assert.AreEqual(str, "A");

多说【最近访客】JS插件通用代码使用方法

多说[最近访客]JS插件通用代码使用方法 多说[最近访客]JS插件可以显示近期访问过你的博客并且已经使用向多说授权过的社交网络账号登录的用户头像,效果如下图所示. 最近访客JS插件的添加步骤如下: 1. 添加多说公用JS代码,每个页面只需添加一次. <!--多说js加载开始,一个页面只需要加载一次 --> <script type="text/javascript"> var duoshuoQuery = {short_name:"您的多说二级域名&q