Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在JavaScript中用匹配的对象值替换模板标记?_Javascript - Fatal编程技术网

如何在JavaScript中用匹配的对象值替换模板标记?

如何在JavaScript中用匹配的对象值替换模板标记?,javascript,Javascript,我有一个JSON对象,用于发送name:value表单参数,一些对象值在花括号之间引用了另一个对象。我想用它们引用的对象值替换任何这样的标记 我尝试使用正则表达式将/\{([^}]+)\}/g替换为obj['$1'],但它不起作用 var objArg = { custom: [], id: 188746, name: "Miscellany", format: "private", section: "service", material: ["internal"],

我有一个JSON对象,用于发送name:value表单参数,一些对象值在花括号之间引用了另一个对象。我想用它们引用的对象值替换任何这样的标记

我尝试使用正则表达式将
/\{([^}]+)\}/g
替换为
obj['$1']
,但它不起作用

var objArg = {
  custom: [],
  id: 188746,
  name: "Miscellany",
  format: "private",
  section: "service",
  material: ["internal"],
  rack_plan_product_attributes: {
    id: 531074,
    product_attributes: {
      id: 635366
    }
  },
  make_up_policy_attributes: {
    id: 324855
  }
}

var s = 'The name is {name} and the rack plan product attributes id is {rack_plan_product_attributes.id}.';

s = s.replace(/\{([^}]+)\}/g, objArg['$1']);

也许我需要使用像
s=s.replace(/\{([^}]+)\}/g,function(r){something…}
这样的函数,但我不太明白它是如何工作的。我希望结果是将
s
转换为
名称是Miscellany,机架计划产品属性id是531074。
您可以使用这样的东西:

var template = 'Hello {@name}'; //1
var data = {name: 'John'}; 
Object.keys(data).forEach(key => {//2
  let strKey = '{@' + key + '}'; 
  template = template.split(strKey).join(data[key]);//3 and 4
});

console.log(template);
说明: 1.使用将被替换的模式创建模板,例如:{@name} 2.迭代所有对象,以便它将尝试查找与模式匹配的键,在本例中,数据具有键“name”和值“John” 3.拆分现在变成[“Hello”,“”]的字符串
4.使用name值加入数组

如果不支持IE,可以将字符串作为模板文本求值

var s = 'The name is {objArg.name} and the rack plan product attributes id is {objArg.rack_plan_product_attributes.id}.';

s = eval( '`' + s.replace(/\s?{\s?/g, '${') + '`');
此部分
s.replace(/\s?{\s?/g,${')
{objArg.name}
替换为
${objArg.name}

eval()
将以javascript的形式计算字符串

使用
eval
时也要非常小心,因为它会以调用者的权限执行传递的代码……但老实说,它已经有一段时间没有被用来伤害用户了,如果您不在用户输入上使用它,那么您应该会没事的

您还可以将其包装在函数中,如:

function template(stringTemplate, {name, rack_plan_product_attributes}){
     stringTemplate = eval( '`' + s.replace(/\s?{\s?/g, '${') + '`');
     return s;
}

s = template( s, objArg )

如果您可以控制字符串,那么您可以显式地使用模板文本 通过将报价替换为波浪形并添加美元符号,如:

var s = `The name is ${objArg.name} and the rack plan product attributes id is ${objArg.rack_plan_product_attributes.id}.`;

希望这有帮助

示例函数有错误,但想法很好。