我想替换字符串公式中的desig
值以计算表达式。
我有一个数组,例如:
var value_array = [
{value: "1", desig: "ABM"},
{value: "2", desig: "LF"},
{value: "3", desig: "DM"},
{value: "4", desig: "CM"},
{value: "5", desig: "AN"}
];
公式为:
(ABM+ABM)* LF*(DM*LF)+CM+AN *AN/LF
我应该得到:
(1+1)* 2*(3*2)+4+5 *5/2
然后我将评估由40,5
产生的字符串。
感谢您的帮助。
答案 0 :(得分:3)
您可以尝试
var value_array =
[{value: "1", desig: "ABM"},
{value: "2", desig: "LF"},
{value: "3", desig: "DM"},
{value: "4", desig: "CM"},
{value: "5", desig: "AN"}];
let formula = '(ABM+ABM)* LF*(DM*LF)+CM+AN *AN/LF'
value_array.forEach( item => {
formula = formula.replace(new RegExp(item.desig,'g'), item.value )
})
console.log( eval( formula ))
答案 1 :(得分:1)
应该使用Dictionnary,而不是使用数组,然后像这样访问所需的行:
var values = {
"ABM": 1,
"LF": 2
};
,然后在公式中像这样使用它:
var res = (values["ABM"] * values["LF"]);
答案 2 :(得分:0)
使用正向超前查询仅匹配desig
个没有组的单词,并且不匹配,例如,带有ABMS的令牌ABM或类似的内容:
var regexTemplate = "(?<=[^A-Z]|\s)$token(?=[^A-Z]|\s|$)";
var value_array =
[{value: "1", desig: "ABM"},
{value: "2", desig: "LF"},
{value: "3", desig: "DM"},
{value: "4", desig: "CM"},
{value: "5", desig: "AN"}];
var formula = '(ABM+ABM)* LF*(DM*LF)+CM+AN *AN/LF';
var expr = value_array.reduce(function(acc, v){
var regex = new RegExp(regexTemplate.replace('$token', v.desig), "g");
acc = acc.replace(regex, v.value);
return acc;
}, formula);
console.log(eval(expr));