现在的需求是:
已经从后台返回了JSON数据,如下:
[{ "c": 1 }, { "f": 1 }, { "e": 1 }, { "y": 2 }]
然后有许多个较为复杂的计算公式,现在取出一个公式,如下:pow( (pow(c+f, 2) + pow(e, 3) + pow(e + y, 2) ), 3/2)
如何快速的替换 c,f,e,y ? 然后我写了一个类似如下的处理代码,但是被老大否决了(PS:当时心中有一万只草泥马飞过)?
"use strict"
let ex1 = "pow( (pow(c+f, 2) + pow(e, 3) + pow(e + y, 2) ), 3/2)"
let returnV = [{
"c": 1
}, {
"f": 1
}, {
"e": 1
}, {
"y": 2
}]
let Reg
let ex1 = expression
.replace(/pow/g, "Math.pow")
for (let i = 0; i < returnV.length; i++) {
let item = returnV[i]
let key = Object.keys(item)
Reg = new RegExp(key, 'g')
ex1 = ex1.replace(Reg, returnV[i][key])
}
console.log(eval(ex1))
求各位大大分享一下有没有更好的处理办法,送上我的膝盖~
const item=Object.assign({}, ...returnV); let s = ex1.replace(/\b([a-z])\b/g,($,$1)=>item[$1]); console.log(eval.call(null, s));
刚尝试了下,也可以用字符串模板来做,es6代码还真是晦涩。
const item=Object.assign({}, ...returnV); function compile(template){ var script = `(function(item){ const pow=Math.pow; return ${ template }; })`; return script; } const template = ex1.replace(/\b([a-z])\b/g, 'item.$1'); const cal= eval(compile(template)); console.log(cal(item))
别 replace 了
直接
let pow = Math.pow;
一种更简洁的方法:
"use strict" let expression = "pow(((c+f)+e),y)" let returnV = [{ "c": 1 }, { "f": 1 }, { "e": 1 }, { "y": 2 }] let Reg let ex1 = expression .replace(/pow/g, "Math.pow") var that = global; returnV.forEach(function(v, k) { Object.assign(that, v); });