使用占位符和replace对象格式化JavaScriptstring?

我有一个string说: My Name is %NAME% and my age is %AGE%.

%XXX%是占位符。 我们需要从一个对象中取代那里的值。

对象如下所示: {"%NAME%":"Mike","%AGE%":"26","%EVENT%":"20"}

我需要parsing对象,并用相应的值replacestring。 所以最终的输出将是:

我的名字是迈克,我的年龄是26岁。

整个事情必须使用纯JavaScript或jQuery来完成。

这将处理所有的匹配,不接触没有replace(只要你的replace值都是string,如果没有,见下文)。

 var replacements = {"%NAME%":"Mike","%AGE%":"26","%EVENT%":"20"}, str = 'My Name is %NAME% and my age is %AGE%.'; str = str.replace(/%\w+%/g, function(all) { return replacements[all] || all; }); 

jsFiddle 。

如果您的一些replace不是string,请确保它们首先存在于对象中。 如果你有一个像例子那样的格式,比如用百分号表示,你可以用in操作符来实现。

jsFiddle 。

然而,如果你的格式没有特殊的格式,即任何string,并且你的replace对象没有null原型,使用Object.prototype.hasOwnProperty() ,除非你能保证你的潜在的replace子string都不会与原型上的属性名称发生冲突。

jsFiddle 。

否则,如果你的replacestring是'hasOwnProperty' ,你会得到一个结果混乱的string。

jsFiddle 。


作为一个侧面说明,你应该被称为replacements一个Object ,而不是一个Array

如何使用ES6模板文字?

 var a = "cat"; var b = "fat"; console.log(`my ${a} is ${b}`); //notice back-ticked string 

更多关于对象文字

你可以使用JQuery(jquery.validate.js)使其工作变得容易。

 $.validator.format("My name is {0}, I'm {1} years old",["Bob","23"]); 

或者,如果您只想使用该function,则可以定义该function,并使用它

 function format(source, params) { $.each(params,function (i, n) { source = source.replace(new RegExp("\\{" + i + "\\}", "g"), n); }) return source; } alert(format("{0} is a {1}", ["Michael", "Guy"])); 

信贷给jquery.validate.js团队

您可以使用像这样的自定义replacefunction:

 var str = "My Name is %NAME% and my age is %AGE%."; var replaceData = {"%NAME%":"Mike","%AGE%":"26","%EVENT%":"20"}; function substitute(str, data) { var output = str.replace(/%[^%]+%/g, function(match) { if (match in data) { return(data[match]); } else { return(""); } }); return(output); } var output = substitute(str, replaceData); 

你可以看到它在这里工作: http : //jsfiddle.net/jfriend00/DyCwk/ 。

使用bob.js你可以格式化类似于C#的string:

 var sFormat = "My name is {0} and I am version {1}.0."; var result = bob.string.formatString(sFormat, "Bob", 1); console.log(result); //output: //========== // My name is Bob and I am version 1.0. 

只要使用replace()

 var values = {"%NAME%":"Mike","%AGE%":"26","%EVENT%":"20"}; var substitutedString = "My Name is %NAME% and my age is %AGE%.".replace("%NAME%", $values["%NAME%"]).replace("%AGE%", $values["%AGE%"]); 

与现代浏览器一样,新版Chrome / Firefox也支持占位符,类似于C风格函数printf()

占位符:

  • %sstring。
  • %d%i整数。
  • %f浮点数。
  • %o对象超链接。

例如

 console.log("generation 0:\t%f, %f, %f", a1a1, a1a2, a2a2); 

顺便说一句, 看到输出:

  • 在Chrome中,使用快捷键Ctrl + Shift + JF12打开开发者工具。
  • 在Firefox中,使用快捷键Ctrl + Shift + K打开开发者工具。 (不要使用F12 ,这将打开不再维护的Firebug ,其控制台标签不会显示消息)

@Update – nodejs支持

好像nodejs不支持%f ,而是可以在nodejs中使用%d 。 使用%d号码将被打印为浮点数,而不仅仅是整数。

如果你想做一些更接近console.log的东西,比如像%s一样replace%s占位符

 >console.log("Hello %s how are you %s is everything %s?", "Loreto", "today", "allright") >Hello Loreto how are you today is everything allright? 

我写了这个

 function log() { var args = Array.prototype.slice.call(arguments); var rep= args.slice(1, args.length); var i=0; var output = args[0].replace(/%s/g, function(match,idx) { var subst=rep.slice(i, ++i); return( subst ); }); return(output); } res=log("Hello %s how are you %s is everything %s?", "Loreto", "today", "allright"); document.getElementById("console").innerHTML=res; 
 <span id="console"/> 

这可以让你做到这一点

NPM: https : //www.npmjs.com/package/stringinject

GitHub: https : //github.com/tjcafferkey/stringinject

通过执行以下操作:

 var str = stringInject("My username is {username} on {platform}", { username: "tjcafferkey", platform: "GitHub" }); // My username is tjcafferkey on Git 

举一个简单的例子:

 var name = 'jack'; var age = 40; log.console('%s is %d yrs old',name,age); 

输出是:

杰克是40岁