我有一个包含数组和映射的 JSON 对象,其中包含一些可以通过传递另一个对象来替换的占位符文本。
例如:
变量或元数据对象可以
我有一个函数,可以根据一些对象来替换字符串。我不确定如何递归地在 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}
在元数据中不存在,因此它不应解析为undefined。如果在元数据对象中找不到该键,它应该保持原样,即${user.tasks[2].name}
。
metadata.user.tasks
中只有一个项目,这就是为什么"Task 2: ${user.tasks[2].name}"
没有被替换(user.tasks[2]
不存在)。你期望的输出是什么? - CertainPerformance