用 javascript 对象替换字符串值
Replace string value with javascript object
我目前正在为 NodeJs 制作一个小模块。为此,我需要一点帮助。
我就这样说吧。
我有一个带字符串的变量。它包含一个字符串 html 值。现在我需要用我的对象 { "title" : "my title" }
替换 $(title)
这样的东西。这可以扩展到用户提供的任何东西。这是当前 code.I 认为我需要 RegEx 才能做到这一点。你们能帮我解决这个问题吗?
var html = `<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document $(title)</title>
</head>
<body>
<h1>Test file, $(text)</h1>
</body>
</html>`;
function replacer(html, replace) {
// i need a regex to replace these data
//return replacedData;
}
replacer(html, { "title" : "my title", "text" : "text is this" });
由于您使用的是 ES6 模板字符串,因此您可以使用名为 'tagged template strings' 的功能。使用标记的模板字符串,您可以修改模板字符串的输出。您通过在模板字符串前面放置 'tag' 来创建标记模板字符串,'tag' 是对方法的引用,该方法将接收列表中的字符串部分作为第一个参数,插值作为剩余的参数。模板字符串的 MDN 页面已经提供了一个示例模板字符串 'tag' 我们可以使用:
function template(strings, ...keys) {
return (function(...values) {
var dict = values[values.length - 1] || {};
var result = [strings[0]];
keys.forEach(function(key, i) {
var value = Number.isInteger(key) ? values[key] : dict[key];
result.push(value, strings[i + 1]);
});
return result.join('');
});
}
您通过调用以下方式使用 'tag':
var tagged = template`<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document ${'title'}</title>
</head>
<body>
<h1>Test file, ${'text'}</h1>
</body>
</html>`;
请注意,变量插值使用语法 ${'key'}
而不是 $(key)
。您现在可以调用生成的函数以获得所需的结果:
tagged({ "title" : "my title", "text" : "text is this" });
运行 es6console
上的代码示例
您可以使用正则表达式来使用简单的模板函数,
var replacer = function(tpl, data) {
var re = /$\(([^\)]+)?\)/g, match;
while(match = re.exec(tpl)) {
tpl = tpl.replace(match[0], data[match[1]])
re.lastIndex = 0;
}
return tpl;
}
像
一样使用
var result = replacer(html, { "title" : "my title", "text" : "text is this" });
编辑
其实如评论中提到的torazaburo,可以重构为
var replacer = function(tpl, data) {
return tpl.replace(/$\(([^\)]+)?\)/g, function(, ) { return data[]; });
}
希望这对您有所帮助
此解决方案使用 template strings 来完成您想要的一切。
这个解决方案的优点是,与另一个答案中提出的天真的 roll-your-own regexp-based 模板替换策略相比,它支持任意计算,如
replacer("My name is ${name.toUpperCase()}", {name: "Bob"});
在这个版本的replacer
中,我们使用new Function
创建一个以对象属性为参数的函数,returns将传入的模板作为模板字符串进行评估。然后我们使用对象属性的值调用该函数。
function replacer(template, obj) {
var keys = Object.keys(obj);
var func = Function(...keys, "return `" + template + "`;");
return func(...keys.map(k => obj[k]));
}
我们使用 ${}
定义模板进行替换(而不是 $()
),但转义为 ${
以防止计算。 (我们也可以将其指定为常规字符串文字,但这样会失去 multi-line 能力)。
var html = `<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document ${title}</title> <!-- escape $ -->
</head>
<body>
<h1>Test file, ${text}</h1> <!-- escape $ -->
</body>
</html>`;
现在一切如您所愿:
replacer(html, { "title" : "my title", "text" : "text is this" });
简单示例:
> replacer("My name is ${name}", {name: "Bob"})
< "My name is Bob"
这是计算字段的示例:
> replacer("My name is ${name.toUpperCase()}", {name: "Bob"})
< "My name is BOB"
甚至
> replacer("My name is ${last ? lastName : firstName}",
{lastName: "Jones", firstName: "Bob", last: true})
< "My name is Jones"
var binddingData=function(id,data){
var me=this,
arr=[];
arr=getControlBindding(id);
arr.forEach(function(node){
var content=getBinddingContent(node.getAttribute('DataTemp'),data);
binddingToHtml(node,content);
})
}
var getControlBindding=function(id){
var me=this;
return document.querySelectorAll('[DataTemp]');
}
var getBinddingContent=function(temp,data){
var me=this,
res='',
hasNull=false;
if(temp==null||typeof temp=='undefined'){
return res;
}
res= temp.replace(/$\{([^\}]+)?\}/g, function(, ) {
if(data[]==null||typeof data[]=='undefined'){
hasNull=true;
}
return data[];
});
return hasNull?'':res;
}
var binddingToHtml=function(node,content){
var me=this;
if(node.getAttribute('IsDateTime')){
node.innerText='';//if u want change it to datetime string
return;
}
if(node.getAttribute('AddBr') && content==''){
node.innerText='';
var brTag=document.createElement('br');
node.appendChild(brTag);
return;
}
node.innerText=content;
}
您通过调用以下方式使用 'tag':
<div DataTemp="${d1}"></div>
<div DataTemp="${d2}"></div>
<div DataTemp="${d3}"></div>
<div DataTemp="${d3}+ +${d1}"></div>
<div DataTemp="${d3}/${d1}"></div>
<div DataTemp="${d4}${d1}"></div>
<div DataTemp="(${d5}${d1})"></div>
<div DataTemp="(${d3}${d1})"></div>
有数据var data={d1:'t1',d2:'t2',d3:'t3'}
我目前正在为 NodeJs 制作一个小模块。为此,我需要一点帮助。
我就这样说吧。
我有一个带字符串的变量。它包含一个字符串 html 值。现在我需要用我的对象 { "title" : "my title" }
替换 $(title)
这样的东西。这可以扩展到用户提供的任何东西。这是当前 code.I 认为我需要 RegEx 才能做到这一点。你们能帮我解决这个问题吗?
var html = `<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document $(title)</title>
</head>
<body>
<h1>Test file, $(text)</h1>
</body>
</html>`;
function replacer(html, replace) {
// i need a regex to replace these data
//return replacedData;
}
replacer(html, { "title" : "my title", "text" : "text is this" });
由于您使用的是 ES6 模板字符串,因此您可以使用名为 'tagged template strings' 的功能。使用标记的模板字符串,您可以修改模板字符串的输出。您通过在模板字符串前面放置 'tag' 来创建标记模板字符串,'tag' 是对方法的引用,该方法将接收列表中的字符串部分作为第一个参数,插值作为剩余的参数。模板字符串的 MDN 页面已经提供了一个示例模板字符串 'tag' 我们可以使用:
function template(strings, ...keys) {
return (function(...values) {
var dict = values[values.length - 1] || {};
var result = [strings[0]];
keys.forEach(function(key, i) {
var value = Number.isInteger(key) ? values[key] : dict[key];
result.push(value, strings[i + 1]);
});
return result.join('');
});
}
您通过调用以下方式使用 'tag':
var tagged = template`<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document ${'title'}</title>
</head>
<body>
<h1>Test file, ${'text'}</h1>
</body>
</html>`;
请注意,变量插值使用语法 ${'key'}
而不是 $(key)
。您现在可以调用生成的函数以获得所需的结果:
tagged({ "title" : "my title", "text" : "text is this" });
运行 es6console
上的代码示例您可以使用正则表达式来使用简单的模板函数,
var replacer = function(tpl, data) {
var re = /$\(([^\)]+)?\)/g, match;
while(match = re.exec(tpl)) {
tpl = tpl.replace(match[0], data[match[1]])
re.lastIndex = 0;
}
return tpl;
}
像
一样使用var result = replacer(html, { "title" : "my title", "text" : "text is this" });
编辑
其实如评论中提到的torazaburo,可以重构为
var replacer = function(tpl, data) {
return tpl.replace(/$\(([^\)]+)?\)/g, function(, ) { return data[]; });
}
希望这对您有所帮助
此解决方案使用 template strings 来完成您想要的一切。
这个解决方案的优点是,与另一个答案中提出的天真的 roll-your-own regexp-based 模板替换策略相比,它支持任意计算,如
replacer("My name is ${name.toUpperCase()}", {name: "Bob"});
在这个版本的replacer
中,我们使用new Function
创建一个以对象属性为参数的函数,returns将传入的模板作为模板字符串进行评估。然后我们使用对象属性的值调用该函数。
function replacer(template, obj) {
var keys = Object.keys(obj);
var func = Function(...keys, "return `" + template + "`;");
return func(...keys.map(k => obj[k]));
}
我们使用 ${}
定义模板进行替换(而不是 $()
),但转义为 ${
以防止计算。 (我们也可以将其指定为常规字符串文字,但这样会失去 multi-line 能力)。
var html = `<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document ${title}</title> <!-- escape $ -->
</head>
<body>
<h1>Test file, ${text}</h1> <!-- escape $ -->
</body>
</html>`;
现在一切如您所愿:
replacer(html, { "title" : "my title", "text" : "text is this" });
简单示例:
> replacer("My name is ${name}", {name: "Bob"})
< "My name is Bob"
这是计算字段的示例:
> replacer("My name is ${name.toUpperCase()}", {name: "Bob"})
< "My name is BOB"
甚至
> replacer("My name is ${last ? lastName : firstName}",
{lastName: "Jones", firstName: "Bob", last: true})
< "My name is Jones"
var binddingData=function(id,data){
var me=this,
arr=[];
arr=getControlBindding(id);
arr.forEach(function(node){
var content=getBinddingContent(node.getAttribute('DataTemp'),data);
binddingToHtml(node,content);
})
}
var getControlBindding=function(id){
var me=this;
return document.querySelectorAll('[DataTemp]');
}
var getBinddingContent=function(temp,data){
var me=this,
res='',
hasNull=false;
if(temp==null||typeof temp=='undefined'){
return res;
}
res= temp.replace(/$\{([^\}]+)?\}/g, function(, ) {
if(data[]==null||typeof data[]=='undefined'){
hasNull=true;
}
return data[];
});
return hasNull?'':res;
}
var binddingToHtml=function(node,content){
var me=this;
if(node.getAttribute('IsDateTime')){
node.innerText='';//if u want change it to datetime string
return;
}
if(node.getAttribute('AddBr') && content==''){
node.innerText='';
var brTag=document.createElement('br');
node.appendChild(brTag);
return;
}
node.innerText=content;
}
您通过调用以下方式使用 'tag':
<div DataTemp="${d1}"></div>
<div DataTemp="${d2}"></div>
<div DataTemp="${d3}"></div>
<div DataTemp="${d3}+ +${d1}"></div>
<div DataTemp="${d3}/${d1}"></div>
<div DataTemp="${d4}${d1}"></div>
<div DataTemp="(${d5}${d1})"></div>
<div DataTemp="(${d3}${d1})"></div>
有数据var data={d1:'t1',d2:'t2',d3:'t3'}