Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 数组到动态函数:是否使用eval?_Javascript_Json_Function_Object_Eval - Fatal编程技术网

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

Javascript 数组到动态函数:是否使用eval?,javascript,json,function,object,eval,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({ idgr

有此目的:

// 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
):


是否值得编写一个动态函数来调用该函数作为第二个选项,或者eval是否足够快以解决此问题?

可以这样编写:

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

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

对象键不总是
User
filter
order\u by
?@user2864740“null”表示不会作为函数调用。@Bergi认为它是完全动态的。不要为此使用eval()。这太危险了,尤其是如果你的数据来自外部。认为bash shellshock不好:你建议做的事情与那个bug是一样的。要么信任数据(本质上是可执行的)来源,要么验证属性并将它们限制为故意公开的方法。你可以使用
reduce
['filter','order\u by']来缩短这个过程。reduce(函数(prop){/*Stuff*/return/*which*/;},规则[“User”];
@user2864740这不是对所有情况都有效。规则非常简单。Null表示没有函数,数组表示函数,数组可以为空。
{User:[],filter:[],order_by:['name','created']};//User()。filter()。order_by('name','created'))
您不明白。您强制调用的是参数。可以调整,但离我想要的相差太远。@EnZo这是有道理的。请记住,总磁贴数与执行操作的次数有关,并且具有执行操作的速度-如果只执行十几次或几百次(甚至是更多的时间)那么即使看起来非常慢,也很少有额外的毫秒不会被注意到。
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);