javascript - 如何解析包含计算的字符串并执行它

标签 javascript vuejs2

我有以下情况

所以我有一个像这样的对象

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/

相关文章:

javascript - 在 JavaScript 中从 JSON 对象访问动态值

javascript - 如何从无序列表中选择第n项?

javascript - 我什么时候应该使用 Vuex?

javascript - 单击按钮即可下载图像数组

Javascript 日期函数返回错误的星期几

javascript - Bootstrap Popover 不会显示 : Error please use show on visible elements

javascript - 如何将输入文本字段中输入的值存储在数据库中

css - 如何绑定(bind)由构成颜色名称、 Angular 等的动态变量组成的线性渐变背景属性?

javascript - 无法读取 v-for 范围内的组件数据

javascript - 如何在 Vue.js 中获取购物车商品的总价格并乘以数量