javascript - 跪求各位大大分享一个更好的解决方法?
PHP中文网
PHP中文网 2017-04-11 13:15:37
[JavaScript讨论组]

现在的需求是:

已经从后台返回了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))

求各位大大分享一下有没有更好的处理办法,送上我的膝盖~

PHP中文网
PHP中文网

认证高级PHP讲师

全部回复(3)
阿神

一种更简洁的方法:

"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);
});
PHP中文网

别 replace 了
直接

let pow = Math.pow;
PHPz
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))
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号