zoukankan      html  css  js  c++  java
  • 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。
    反而比他那个多次正则替换来的快呢。

  • 相关阅读:
    Asp.net Treeview 客户端选中效果实现 (初级)
    MYSQL生成日历表,通常在做报表的时候需要用来生成一个临时表,用来左连接等。
    写了一个抽奖类,感觉还不错,可以适合各种变化
    将系统的内部类:HttpValueCollection 移到自己的系统中,使其能方便的解析id=1&name=张三&sex=男这样的字符串参数 querystring
    指定某个文件的创建 修改 访问时间
    Reqeust["keyname"] 的读取顺序
    pku1463 Strategic game
    pku1947 Rebuilding Roads
    pku1848 Tree
    pku1056 IMMEDIATE DECODABILITY
  • 原文地址:https://www.cnblogs.com/52cik/p/js-string-format.html
Copyright © 2011-2022 走看看