【问题标题】:Javascript: something like string.format with property namesJavascript:类似于带有属性名称的 string.format
【发布时间】:2015-06-16 17:35:28
【问题描述】:

我想创建一个方法,我可以通过格式字符串传递一个记录集(可以很容易地成为一个通用对象),以按名称替换值。我在 SO 上找到了另一个答案,几乎做到了:https://stackoverflow.com/a/2534828/359135

function format(str, obj) {
    return str.replace(/\{\s*([^}\s]+)\s*\}/g, function(m, p1, offset, string) {
        return obj[p1]
    })
}

但它不太有效(我不认为):http://jsfiddle.net/9Jpkv/24/

注意:我的记录集版本只是:

function format(str, rs) {
    return str.replace(/\{\s*([^}\s]+)\s*\}/g, function(m, p1, offset, string) {
        return rs(p1); //use recordset names accessors instead of object properties
    })
}

我希望能够做到这一点,而无需像上面的代码几乎可以做到的那样遍历对象(或记录集的列)的属性。相反,它会查找大括号之间的项目并尝试在对象属性(或记录集列)中找到它们

或者实际上我是个白痴,上面确实有效!:http://jsfiddle.net/9Jpkv/26/

我没有传递对象!

【问题讨论】:

  • 那里有很多东西,一个流行的项目是php.js,类似于命令sprintf

标签: javascript regex string-formatting


【解决方案1】:
function template(str, data) {
  data = data || {};
  Object.keys(data).forEach(function(key) {
   str = str.replace(new RegExp('{{' + key + '}}', 'g'), data[key]);
  });
  return str;
}

像这样? -- 它将所有 {{name}} 替换为数据参数中的对应值

template('<div>{{name1}}</div> <span>{{name2}}</span>', { name1: 'value1', name2: 'value2' })

http://jsbin.com/kefazajude/edit?js,console

function template(str, data) {
  data = data || {};

  str.match(/{{(.+?)}}/g).forEach(function(key) {
   str = str.replace(key, data[key.replace('{{','').replace('}}', '')]);
  });
  return str;
}

http://jsbin.com/baxuyateme/edit?js,console

大括号

function template(str, data) {
  data = data || {};

  str.match(/{(.+?)}/g).forEach(function(key) {
   str = str.replace(key, data[key.replace('{','').replace('}', '')]);
  });
  return str;
}

http://jsbin.com/tumobohelo/edit?js,console

【讨论】:

  • 这很好,但我想从花括号中的值开始,然后在属性中查找它们,而不是遍历属性。
  • 非常感谢.. 结果我发布的示例有效,但我是个白痴。但是我更喜欢您的解决方案,因为我实际上了解它的工作原理并且可以对其进行调试:D
  • 你也使用了双花括号,我希望切换到但对正则表达式修改没有信心;)
【解决方案2】:
String.format = function() {
    var theString = arguments[0];

    for (var i = 1; i < arguments.length; i++) {
        var regEx = new RegExp("\\{" + (i - 1) + "\\}", "gm");
        theString = theString.replace(regEx, arguments[i]);
    }

    return theString;
}

用途:

var string = String.format('{0}-{1}-{2}', string1, string2, string3);

你应该看看JavaScript equivalent to printf/string.format,这可能会有所帮助。

【讨论】:

  • 谢谢.. 唯一的事情是我想使用命名属性而不是数字,理想情况下我会在属性中查找大括号中的值,而不是在大括号中查找属性。我将更新问题以更具体
猜你喜欢
  • 2015-06-16
  • 1970-01-01
  • 2011-08-12
  • 2013-11-21
  • 1970-01-01
  • 2012-01-27
  • 2011-02-25
  • 2010-12-15
  • 1970-01-01
相关资源
最近更新 更多