使用占位符和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()
。
占位符:
-
%s
string。 -
%d
,%i
整数。 -
%f
浮点数。 -
%o
对象超链接。
例如
console.log("generation 0:\t%f, %f, %f", a1a1, a1a2, a2a2);
顺便说一句, 看到输出:
- 在Chrome中,使用快捷键
Ctrl + Shift + J
或F12
打开开发者工具。 - 在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岁