私は、単純なコンパレータを使用して、代わりにいくつかのデータを渡すと文字列フィルタを渡すように使用しようとします。 [].filter
コンパレータはフィルタとなる関数を返さなければなりません。それは見ていきますこのswitch文を最適化するにはどうすればよいですか?
var filterFn = comparator.apply({}, /(.+)(=|>=|<=|<|>|!=|==|!==)(.+)/.exec("id<4").slice(1));
someModel = someModel.objects.filter(filterFn);
対象:
var comparator = function(a, b, c) {
switch(b){
case '>=': return function() { return this[a] >= c;}; break;
case '<=': return function() { return this[a] <= c;}; break;
case '<': return function() { return this[a] < c;}; break;
case '>': return function() { return this[a] > c;}; break;
case '=': return function() { return this[a] == c;}; break;
case '==': return function() { return this[a] === c;}; break;
case '!=': return function() { return this[a] != c;}; break;
default: return null;
};
}
は私がすることで、この機能を入手したと
someModel.get = function(filter){
return new Model(
this.objects.filter(
comparator.apply({}, /(.+)(=|>=|<=|<|>|!=|==|!==)(.+)/.exec("id<4").slice(1)
)
);
};
var filtered = someModel.get("id<4");
質問です - 私はそれがより多くの事業者になることを想定し、もっと簡単に書く方法はわかりません。
Evalの使用は問題になります。
このコードは実行もテストもされていませんでしたが、私が意味することを示すために書いてあります。
演算子 'c'を既知のホワイトリストの可能な値の配列と比較しても、' eval() 'は問題になりませんか? –
完全な式パーサーが必要ですか。単一の演算子だけではありませんか? – Lucero
各 'return'の後に' break'ステートメントは必要ないことに注意してください。 – nnnnnn