有这个对象:
// Better as array, thank you for the advice @user2864740
var rule = [
['User', null],
['filter', [{ idgroup: 95, active: true}],
['order_by', ['name', 'created']]
];
我想基于上面的对象创建一个函数。我只知道两种方法。第一个是使用eval
并使函数文字:
eval("User.filter({ idgroup: 95, active: true }).order_by('name', 'created')");
另一种方式更复杂,我还不确定如何处理它。但结果应该是这样的(显然有一个for/while
):
this['User']['filter'].apply(this['User'], [{ idgroup: 95, active: true }])['order_by'].apply(this['User'], ['name', 'created']);
是否值得编写一个动态函数来调用该函数作为第二个选项,还是eval足够快以解决这个问题?
答案 0 :(得分:1)
它可能写成:
var rules = [ /* the set of rules */ ];
// Or whatever the first rule will invoked upon
var result = this;
// Apply each rule in turn
rules.forEach(function (rule) {
var prop = rule[0];
var value = rule[1];
if (value === null) {
// Property look-up only
result = result[prop];
} else {
// Call the function with the same name and apply rule arguments
result = result[prop].apply(result, value);
}
});
// Use result:
console.log(result);
更复杂的规则描述符需要更复杂的处理。