javascript - 在 API 中使用不同的计算规则

标签 javascript json api

比方说,我有一个 JS 对象数组,如下所示:

var forceData = 
    [ 
       { 
          "mass":5,
          "acceleration":2,
          "ruleToCalculateForce":"mass * acceleration"
       },
       { 
          "mass":5,
          "acceleration":3,
          "ruleToCalculateForce":"mass * acceleration"
       }
    ]

ruleToCalculateForce contains how to calculate force using mass and acceleration using Newton's Law which is Force = mass * acceleration. The value of this key has same names of the keys associated with it (mass & acceleration).

现在我想要的是根据ruleToCalculateForce中定义的规则计算质量和加速度相乘的结果。

所以,我想说的是,是否可以将 forceData 对象数组转换为类似这样的内容,其中结果(新键)可以根据在ruleToCalculateForce中定义的规则:

var forceData = 
    [ 
       { 
          "mass":5,
          "acceleration":2,
          "result" : 10,
          "ruleToCalculateForce":"mass * acceleration"
       },
       { 
          "mass":5,
          "acceleration":3,
          "result" : 15,
          "ruleToCalculateForce":"mass * acceleration"
       }
    ]

forceData 规则可以是动态的。假设力数据类似于:

var forceData = 
        [ 
           { 
              "mass":5,
              "acceleration":2,
              "ruleToCalculateForce":"mass + acceleration"
           },
           { 
              "mass":5,
              "acceleration":3,
              "ruleToCalculateForce":"mass + acceleration"
           }
        ]

那么更新后的对象数组应该执行求和而不是乘法,它应该是:

var forceData = 
        [ 
           { 
              "mass":5,
              "acceleration":2,
              "result" : 7,
              "ruleToCalculateForce":"mass + acceleration"
           },
           { 
              "mass":5,
              "acceleration":3,
              "result" : 8,
              "ruleToCalculateForce":"mass + acceleration"
           }
        ]

最佳答案

将函数表示为字符串是可能的,但很危险且丑陋。这通常需要 eval 方法或函数构造函数,这两种方法都令人不悦。

相反,由于您没有说需要将函数存储为字符串,所以我建议将函数存储为函数。

let forceRule1 = obj => obj.mass * obj.acceleration;
let forceRule2 = obj => obj.mass + obj.acceleration;

let forceData = [
  {
    'mass': 5,
    'acceleration': 2,
    'ruleToCalculateForce': forceRule1
  }, {
    'mass': 5,
    'acceleration': 3,
    'ruleToCalculateForce': forceRule2
  }
];

forceData.forEach(obj => obj.resultForce = obj.ruleToCalculateForce(obj));
console.log(forceData);

编辑,根据评论已澄清规则必须是字符串。在这种情况下,使用 eval 或函数构造函数可以工作:

let forceData = [
  {
    'mass': 5,
    'acceleration': 2,
    'ruleToCalculateForce': 'mass * acceleration'
  },
  {
    'mass': 5,
    'acceleration': 3,
    'ruleToCalculateForce': 'mass + acceleration'
  }
];

forceData.forEach(obj => obj.result = 
    new Function('mass', 'acceleration', `return ${obj.ruleToCalculateForce}`)(obj.mass, obj.acceleration));
console.log(forceData);

关于javascript - 在 API 中使用不同的计算规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58978885/

相关文章:

javascript - 返回函数的最后一个参数

javascript - NodeJS + Ajax + 登录表单

javascript - 动态添加带有jquery错误的元素

javascript - SyntaxError : expected expression, 在使用 $.getJSON() 函数时得到 '.'

java - Java 中好的 HTML 对象模型?

javascript - 使用 Protovis 的对数条形图

javascript - 为什么我收到错误 app.get is not a function in express.js

android - 无法在android中获取json数组

java - 我的内部 API 类应该全部放在一个包中吗?

python - CreateRestrictedToken - SidsToDisable