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。
反而比他那个多次正则替换来的快呢。
js 实现 C# 的 format 方法的更多相关文章
- 实现Date函数属性中的format方法
js中没有Date.format方法的,所以在date属性中加format方法 //js格式化属性 Date.prototype.format = function (format) { var o ...
- 我在一个前端项目中用js整理的一些通用方法,其中使用到的思想,主要就是约定了。
把名称和后台来的json数据约定起来,可以达到的效果就是可以将东西统一化,减少差异,提升模块等的通用性,此后就可以实现具体不同模块内容可以自动或拷贝赋值的方式 2016.7.18 refactor s ...
- js相关的时间获取方法
1.获取时间 var time=new Date();//返回的是GMT,格林尼治标准时间. console.log(time)://Thu Jul 27 2017 16:55:21 GMT+0800 ...
- JS中 call() 与apply 方法
1.方法定义 call方法: 语法:call([thisObj[,arg1[, arg2[, [,.argN]]]]]) 定义:调用一个对象的一个方法,以另一个对象替换当前对象. 说明: call ...
- 【转】js 关键字 in 的使用方法
js 关键字 in 的使用方法 原文地址:http://sunct.iteye.com/blog/1709017 1.For...In 声明用于对数组或者对象的属性进行循环/迭代操作. 对于数组 ...
- Jquery.cookie.js 源码和使用方法
jquery.cookie.js源码和使用方法 jQuery操作cookie的插件,大概的使用方法如下 $.cookie(‘the_cookie’); //读取Cookie值$.cookie(’the ...
- VFP自定义函数StringFormat (仿.NET String.Format 方法)
VFP仿.NET String.Format 方法 将指定字符串中的每个{x}替换为相应值,并返回文本 *-- 调用格式 StringFormat("日期{2},字符{1}",&q ...
- JS数组添加字典的方法
var ary_RoleType = []; //申明数组变量 for(var j = 0;j<treeData.length;j++){ if($.inArray(treeData[j].v ...
- JS去掉首尾空格 简单方法大全(原生正则jquery)
JS去掉首尾空格 简单方法大全 var osfipin= ' http://www.cnblogs.com/osfipin/ '; //去除首尾空格 osfipin.replace(/(^\s*)|( ...
随机推荐
- 【树形动规】HDU 5834 Magic boy Bi Luo with his excited tree
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5834 题目大意: 一棵N个点的有根树,每个节点有价值ci,每条树边有费用di,节点的值只能取一次,边 ...
- 【最大流】BAPC2014 A Avoiding the Apocalypse (Codeforces GYM 100526)
题目链接: http://codeforces.com/gym/100526 http://acm.hunnu.edu.cn/online/?action=problem&type=show& ...
- 付出半个小时的笔误级BUG
一开始,我为了偷懒将所有的任务全都压在了一个浮动指针上: for (; CCPtr->S != NULL; CCPtr->S = CCPtr->S->next) // for ...
- 敏捷开发 and 敏捷测试
名词解释 agile: 敏捷的:灵活:敏捷开发. scrum: 扭打,混打:并列争球:参加并列争球. sprint: 冲刺,全速跑. backlog: 积压的工作:积压待办的事务. retrospe ...
- Java调用R(二)_JRI
推荐使用.相比RServe更灵活,效率更高. 基本步骤 1. R中需要安装rJava包. 2. 系统变量Path加上 C:\Program Files\R\R-3.0.1\bin\i386;C:\ ...
- hibernate生成查询语句但查不到数据
hibernate能够生成查询语句 说明它已经进行了查询操作 返回结果数据记录为0 很可能出现的情况 是 :该查询未未访问到指定数据库表. 当使用的数据库为oracle数据库时,你会在bean配置 ...
- springmvc框架原理分析
第一步:用户发起请求到前端控制器(DispatcherServlet) 第二步:前端控制器请求HandlerMapping查找Handler,可以根据xml配置,注解进行查找 第三步:处理器映射器Ha ...
- 解密HOMS
一个可以做证券账户多账户和子账户管理软件.早年是提供给基金或者机构使用的,毕竟传统印象中,也只有他们有多个账户需要汇集.单一账户需要拆分. 本来作为专业的工具,在小范围内传播,和大众也没多大关系,行业 ...
- python字符串连接的三种方法及其效率、适用场景详解
python字符串连接的方法,一般有以下三种:方法1:直接通过加号(+)操作符连接website=& 39;python& 39;+& 39;tab& 39;+& ...
- [置顶] [Android源码分析]inquiry result引起的上层变化分析
在上一篇文章中,我们详细分析了android是如何解析蓝牙反馈上来的搜索到的设备信息,本文将会继续分析这些信息到了上层之后是如何处理. 8.inquiry result引起的上层变化 我们知道inqu ...