One possible way:
keys = Object.keys;
values = function(obj) { return keys(obj).map(function(k) {
return obj[k]
})};
var stats = { a:1, b:2, c:3 };
expr = 'a+b*c'
fun = Function.apply(null, keys(stats).concat('return (' + expr + ')'))
result = fun.apply(null, values(stats))
console.log(result) // 7
The same as a reusable function:
evalWith = function(context, expr) {
return Function.apply(
null, Object.keys(context).concat('return (' + expr + ')')
).apply(null, Object.keys(context).map(function(k) {
return context[k]
}));
}
var stats = { a:1, b:2, c:3 };
result = evalWith(stats, 'a+b*c');
Using eval
:
evalWith = function(context, expr) {
return eval(Object.keys(context).map(function(k) {
return "var " + k + "= context." + k;
}).concat(expr).join(";"));
}