我有以下情况
所以我有一个像这样的对象
var y = {
"data": {
"m": 2,
"n": "meaow",
"k": "lop",
"r": {
"val": 400,
"text": "Hoila papi"
}
}
}
现在我想让我的用户编写一个我可以根据该对象解析的公式 像这样
var x = {
"calculation": "((@data>m# * 100) + (@data>r>val# / 200))",
"target": "data>m"
}
有没有一种方法可以用 Javascript 做到这一点 所以最后的结果应该是
{
"data": {
"m": 202,
"n": "meaow",
"k": "lop",
"r": {
"val": 400,
"text": "Hoila papi"
}
}
}
最佳答案
使用正则表达式匹配 @prop>prop...
字符串,并通过对属性数组使用 reduce
将它们替换为适当的值。假设输入是可信的,然后您可以eval
生成的数学字符串,并使用相同的 reduce
方法找到要更新的嵌套对象。
请注意 ((200 * 100) + (400/200))
结果是 20002
,而不是 202
:
var y = {
"data": {
"m": 200,
"n": "meaow",
"k": "lop",
"r": {
"val": 400,
"text": "Hoila papi"
}
}
}
var x = {
"calculation": "((@data>m# * 100) + (@data>r>val# / 200))",
"target": "data>m"
};
const getNested = (propArr, initial) => propArr.reduce((a, prop) => a[prop], initial);
const mathStr = x.calculation.replace(/@(\S+)#/g, (_, propStr) => (
Number(getNested(propStr.split('>'), y))
));
console.log(mathStr);
if (/[^-+/*0-9() ]/.test(mathStr)) {
throw new Error('Unrecognized, potentially unsafe character found');
}
const targetPropArr = x.target.split('>');
const lastProp = targetPropArr.pop();
const lastObj = getNested(targetPropArr, y);
lastObj[lastProp] = eval(mathStr);
console.log(y);
关于javascript - 如何解析包含计算的字符串并执行它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53722157/