JavaScript:如何使用模板字面量与JSON?

16

今天我发现了Javascript ES6模板字符串。用一个词来形容:太棒了!

问题:如何将模板字符串存储并作为JSON加载? 我通过XHR加载一些文件,然后使用一些JSON.parse(),它不支持使用`代替",因此似乎不能直接将模板字符串保存在文件中。

目标:将其用于动态字符串和翻译,并摆脱像("Hello " + username + "! How are you?")这样令人困惑的内容,该内容需要为仅包含一条消息而存储多个字符串,而是像下面这样美观而简单地保存我的东西

`Hello, ${username}! How are you?`

username指向相同名称的动态变量,这是否可能?如果可以,如何实现?如果必须使用函数将字符串转换为模板文本,也可以,只要整体性能不受影响即可,但我至少想避免eval


8
这些文字常量是代码而不是字符串。你不能将它们存储为 JSON,但你可以使用函数。例如:var tplHello = ({username}) => \Hello, ${username}! How are you?`,然后可以这样使用它:var data={ username: "foo" },text = tplHello(data)`。 - Thomas
2
@Thomas:谢谢。正如你所说,我似乎混淆了模板文字与“动态字符串”。根据 https://dev59.com/YF0a5IYBdhLWcg3w88rU 将字符串转换为模板文字将隐式地与 eval 相同,因为变量查找始终需要执行代码。看来我的一个误解激发了我对于一种简单的翻译系统或“动态”字符串的希望。离题:我想在字符串中使用 RegEx 替换 %username(或类似内容)更适合我想要实现的目标。 - nora
4个回答

12
你可以创建自己的函数来解析模板字面量,

function stringTemplateParser(expression, valueObj) {
  const templateMatcher = /{{\s?([^{}\s]*)\s?}}/g;
  let text = expression.replace(templateMatcher, (substring, value, index) => {
    value = valueObj[value];
    return value;
  });
  return text
}

console.log(stringTemplateParser('my name is {{name}} and age is {{age}}', {name: 'Tom', age:100}));


// output 'my name is Tom and age is 100'


要使用${variable}格式,请改用此函数:function stringTemplateParser(expression, valueObj) { const templateMatcher = /\${\s?([^{}\s]*)\s?}/g; let text = expression.replace(templateMatcher, (substring, value, index) => { value = valueObj[value]; return value; }); return text } - howMuchCheeseIsTooMuchCheese

4
您可以始终使用JSON.stringify来封装动态数据:
const data = 'some value';
JSON.stringify({
  data,
});
// expected: "{\"data\": \"some value\"}"

1
我发现将问题分解为几个JSON子字符串更容易。创建键“message”,并将该键存储消息的部分。这也适用于i18n。
{
  "message" : {
    "_0": "first part ",
    "_1": "after first variable. ",
    "_2": "after another variable"
  }
}

在解码后,您可以像这样访问它:${message._0}${variable}${message._1}${var2}${message._2}

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接