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