js 实现 C# 的 format 方法
2014-11-08 12:18:51 更新,修复原形链方法被当作关键词的bug,其实之前是想用全局关键词的,不过还是算了,array里有太多单词了。
现在 length callee 关键词依然会被输出,以后修复,现在为了精简就将就着用了。
2014-08-26 14:55:30 更新,修复 #5楼 冲动 兄弟提出的问题。
其实我根本不会 C# 只是看到人家写了个这种功能《js实现类似c#中的字符串处理方法format()》
我看了下代码,觉得思路繁琐,所以简化思路写一个一样的功能的方法,和大家分享下思路。
先来看下代码吧。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | 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。
反而比他那个多次正则替换来的快呢。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· [AI/GPT/综述] AI Agent的设计模式综述