我有一个字符串说: My Name is %NAME% and my age is %AGE%.
%XXX%
是占位符。我们需要从对象那里替换值。
对象看起来像: {"%NAME%":"Mike","%AGE%":"26","%EVENT%":"20"}
我需要解析对象并将字符串替换为相应的值。这样最终输出将是:
我的名字叫迈克,我的年龄是26。
整个过程必须使用纯JavaScript或jquery完成。
我有一个字符串说: My Name is %NAME% and my age is %AGE%.
%XXX%
是占位符。我们需要从对象那里替换值。
对象看起来像: {"%NAME%":"Mike","%AGE%":"26","%EVENT%":"20"}
我需要解析对象并将字符串替换为相应的值。这样最终输出将是:
我的名字叫迈克,我的年龄是26。
整个过程必须使用纯JavaScript或jquery完成。
{NAME: "Mike", AGE: 26, EVENT: 20}
吗?当然,您仍然需要这些键在输入字符串中以百分号结尾。
Answers:
显然,原始问题的要求无法从字符串插值中受益,因为这似乎是对任意替换键的运行时处理。
但是,如果只需要进行字符串插值,则可以使用:
const str = `My name is ${replacements.name} and my age is ${replacements.age}.`
请注意,反引号分隔字符串,这是必需的。
对于适合特定OP要求的答案,您可以使用它String.prototype.replace()
来替代。
以下代码将处理所有匹配项,并且不进行任何替换就不会碰(只要替换值都是字符串,如果不是,请参见下文)。
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;
});
如果某些替换项不是字符串,请确保它们首先存在于对象中。如果您具有类似示例的格式,即用百分号包裹,则可以使用in
运算符来实现。
但是,如果您的格式没有特殊格式(即任何字符串),并且您的替换对象没有null
原型,请使用Object.prototype.hasOwnProperty()
,除非您可以保证所有可能的替换子字符串都不会与原型上的属性名称发生冲突。
否则,如果您的替换字符串为'hasOwnProperty'
,则您将得到结果混乱的字符串。
附带说明一下,您应该称呼replacements
为Object
,而不是Array
。
return replacements[all] || all
掩盖%NotInReplacementsList%
案例。
return all in params ? params[all] : all;
0
。在这种情况下,它不起作用。
如何使用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 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团队
$.each
您可以String.prototype.format=function(p){var s=this,r=function(v,i){s=s.replace(new RegExp("\\{"+i+"\\}","g"),v);};p.forEach(r);return s;}
这样做,因此您不必只为那个添加jquery;)
与现代浏览器一样,Chrome / Firefox的新版本也支持占位符,类似于C样式功能printf()
。
占位符:
%s
串。%d
,%i
整数。%f
浮点数。%o
对象超链接。例如
console.log("generation 0:\t%f, %f, %f", a1a1, a1a2, a2a2);
顺便说一句,看输出:
Ctrl + Shift + J
或F12
打开开发人员工具。Ctrl + Shift + K
或F12
打开开发人员工具。@Update-Node.js支持
似乎nodejs不支持%f
,而是可以%d
在nodejs中使用。带%d
数字将被打印为浮点数,而不仅仅是整数。
只需使用 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%"]);
您可以使用以下自定义替换功能:
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/。
如果您想做更接近console.log的事情,例如替换%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"/>
你会得到
>log("Hello %s how are you %s is everything %s?", "Loreto", "today", "allright")
>"Hello Loreto how are you today is everything allright?"
更新
我添加了一个简单的变量,String.prototype
在处理字符串转换时非常有用,就是这样:
String.prototype.log = function() {
var args = Array.prototype.slice.call(arguments);
var rep= args.slice(0, args.length);
var i=0;
var output = this.replace(/%s|%d|%f|%@/g, function(match,idx) {
var subst=rep.slice(i, ++i);
return( subst );
});
return output;
}
在这种情况下,您将
"Hello %s how are you %s is everything %s?".log("Loreto", "today", "allright")
"Hello Loreto how are you today is everything allright?"
在这里尝试这个版本
formatMessage(message: string, values: string[]) { let i = 0; return message.replace(/%\w+%/g, (match, idx) => { return values[i++]; }); }
这将消息格式化为替换值的格式和数组,并寻找%SOME_VALUE%
当前,此行为在Javascript中仍然没有本地解决方案。标记模板是相关的,但是不能解决。
这是alex解决方案的重构其中有一个替换对象。
该解决方案使用箭头函数和占位符类似的语法作为模板文字({}
而不是%%
)中的本机Javascript插值。另外,在替换名称中也不需要包含定界符(%
)。
有两种口味:描述性和简化性。
描述性解决方案:
const stringWithPlaceholders = 'My Name is {name} and my age is {age}.';
const replacements = {
name: 'Mike',
age: '26',
};
const string = stringWithPlaceholders.replace(
/{\w+}/g,
placeholderWithDelimiters => {
const placeholderWithoutDelimiters = placeholderWithDelimiters.substring(
1,
placeholderWithDelimiters.length - 1,
);
const stringReplacement = replacements[placeholderWithoutDelimiters] || placeholderWithDelimiters;
return stringReplacement;
},
);
console.log(string);
简化的解决方案:
const stringWithPlaceholders = 'My Name is {name} and my age is {age}.';
const replacements = {
name: 'Mike',
age: '26',
};
const string = stringWithPlaceholders.replace(/{\w+}/g, placeholder =>
replacements[placeholder.substring(1, placeholder.length - 1)] || placeholder,
);
console.log(string);
这使您可以做到这一点
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
const stringInject = (str = '', obj = {}) => {
let newStr = str;
Object.keys(obj).forEach((key) => {
let placeHolder = `#${key}#`;
if(newStr.includes(placeHolder)) {
newStr = newStr.replace(placeHolder, obj[key] || " ");
}
});
return newStr;
}
Input: stringInject("Hi #name#, How are you?", {name: "Ram"});
Output: "Hi Ram, How are you?"
我编写了一个代码,可让您轻松设置字符串格式。
function format() {
if (arguments.length === 0) {
throw "No arguments";
}
const string = arguments[0];
const lst = string.split("{}");
if (lst.length !== arguments.length) {
throw "Placeholder format mismatched";
}
let string2 = "";
let off = 1;
for (let i = 0; i < lst.length; i++) {
if (off < arguments.length) {
string2 += lst[i] + arguments[off++]
} else {
string2 += lst[i]
}
}
return string2;
}
format('My Name is {} and my age is {}', 'Mike', 26);
我叫迈克,我26岁