【发布时间】:2019-04-14 02:43:12
【问题描述】:
我有一个 json 对象,它由数组和带有一些占位符文本的映射组成,这些占位符文本可以通过传递另一个对象来替换。
例如。
data = {
"name": "Hello ${user.name}",
"primary_task": "Task Name: ${user.tasks[0].name}",
"secondary_tasks": ["Task 2: ${user.tasks[1].name}", "Task 2: ${user.tasks[2].name}"]
}
变量或元数据对象可以是
variables = {
"user": {
"name": "DJ"
},
"tasks": [
{
"name": "Task One"
}
]
}
我有一个函数可以根据某个对象获取字符串并进行替换。我不确定如何在 JSON 对象上递归调用它,以便它可以替换映射和数组中的所有字符串值
var data = {
"name": "Hello ${user.name}",
"primary_task": "Task Name: Task One",
"secondary_tasks": ["Task 2: ${user.tasks[1].name}", "Task 2: ${user.tasks[2].name}"]
}
var metadata = {
"user": {
"name": "DJ",
"tasks": [
{
"name": "Task One"
}
],
},
}
function subString(str) {
var rxp = /\{([^}]+)\}/g,
liveStr = str,
curMatch;
while( curMatch = rxp.exec( str ) ) {
var match = curMatch[1];
liveStr = liveStr.replace("${"+ match + "}", tryEval(match));
}
return liveStr;
}
function tryEval(evalStr) {
evalStr = "metadata." + evalStr;
try {
return eval(evalStr);
}
catch(error) {
return "${" + evalStr + "}";
}
}
var str = "user ${user.name} - ${user.tasks[0].name} - ${user.tasks[2].name}";
console.log("Sub " + subString(str));
在上面的示例中,${user.tasks[2].name} 在元中不存在,因此它不应解析为未定义。如果在元对象中找不到密钥,它应该保持原样,即${user.tasks[2].name}
【问题讨论】:
-
我写了一个解析属性函数,你可以扩展它来处理数组。 stackblitz.com/edit/typescript-fchtqv
-
为什么第一名的应用是这样设计的?
-
数据和元数据从何而来? ${} 位如何进入数据?我假设您没有对数据进行硬编码?是否有任何参数定义元数据的结构?如果数据有字段,元数据没有怎么办?
-
metadata.user.tasks中只有一项,这就是为什么"Task 2: ${user.tasks[2].name}"没有被替换(user.tasks[2]不存在)。您的预期输出是什么?
标签: javascript node.js