【发布时间】:2020-12-21 07:29:35
【问题描述】:
我想处理两个对象。
obj1 具有公式的数组对象。
obj2 有值。 我想处理/计算这两个对象以获得结果,使得 obj1 中存在的键成为输出中的实际键,并使用公式处理值。用 EVAL 做了,但不想用 eval 它。
请建议任何其他方法来做同样的事情。
const obj1 = [{ _id: '5 f467650890a7444d8d9ea5b', keyname: 'fTime',
PTag: '(FaultHrs*360)+(FaultMins*60)+FaultSecs', __v: 0 },
{ _id: '5 f467650890a7444d8d9ea5b', keyname: 'rTime',
PTag: '(RunHrs*360)+(RunMins*60)+RunSecs', __v: 0 }
]
const obj2 = { FaultHrs: 2, FaultMins: 0, FaultSecs: 49, RunHrs: 1, RunMins: 0, RunSecs: 0,}
const res = obj1.reduce((res, k) => {
// find out parameters in formula
const matches = k.PTag.match(/[a-zA-Z]+/g);
// substitute them with numbers
const newTag = matches.reduce((tag, m) => tag.replace(m, obj2[m] || 0), k.PTag);
// calculate result
res[k.keyname] = eval(newTag);
return res;
}, {});
console.log(res)
【问题讨论】:
-
如果输入是可信的——保证是一个数学表达式,没有不安全的代码——那么
eval可能是最好的选择。这并不是绝对的邪恶,只是它通常不是正确的选择 - 但这是一种情况,IMO -
@CertainPerformance 不应该使用
new Function()而不是eval()? -
@Ifaruki 我看不出有什么理由比另一个更喜欢这里,你有什么想法吗?
-
@CertainPerformance 我读到
new Function()更好更快,但他们没有详细解释。如果你看一下速度比较measurethat.net/Benchmarks/Show/2858/0/eval-vs-new-function实际上是有区别的 -
感谢您的帮助,我会尝试新功能。
标签: javascript node.js arrays json object