Javascript:类似 string.format 的名称,名称为 属性

Javascript: something like string.format with property names

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

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/

我不是在传递对象!

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

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,这可能会有帮助。