2014-09-30 1 views
0

이 객체를 갖는동적 함수에 대한 배열 : 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')"); 

다른 방법이 더 복잡하고 나는 아직 그것을 접근하는 방법을 모르겠어요.

this['User']['filter'].apply(this['User'], [{ idgroup: 95, active: true }])['order_by'].apply(this['User'], ['name', 'created']); 

이 가치가 두 번째 옵션으로 함수를 호출 할 수있는 동적 함수를 작성, 아니면 충분히 빨리이 문제를 해결하기 위해 평가입니다 :하지만 결과는 (분명히 for/while와) 같은 것을해야 하는가?

+0

객체 키는 항상'User','filter' 및'order_by'입니까? – Bergi

+0

@ user2864740 'null'은 함수로 호출되지 않습니다. – EnZo

+0

@Bergi는 완전히 동적 인 아이디어입니다. – EnZo

답변

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

더 복잡한 규칙 설명이 더 복잡한 처리가 필요합니다.

+2

reduce [function '(prop) {/ * Stuff */return/* whatever * /;}, rules [ "User"]); ' – soktinpk

+0

@ user2864740 모든 경우에 유효하지는 않습니다. – EnZo

+0

규칙은 매우 간단합니다. Null은 함수를 의미하지 않고 배열은 함수를 의미하며 배열은 비어있을 수 있습니다. '{ 사용자 : [], 필터 : [], order_by : [ 'name', 'created'] }; // 사용자(). 필터(). order_by ('name', 'created') ' – EnZo

관련 문제