数组到动态函数:是否使用eval?

时间:2014-09-30 01:51:12

标签: javascript json function object eval

有这个对象:

// 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足够快以解决这个问题?

1 个答案:

答案 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);

更复杂的规则描述符需要更复杂的处理。