gpt4 book ai didi

javascript - 我该如何优化这个 switch 语句?

转载 作者:搜寻专家 更新时间:2023-11-01 05:07:00 25 4
gpt4 key购买 nike

我尝试在我的应用程序中使用简单的比较器来过滤一些数据,而不是像 eg 那样使用传递的字符串过滤器。传递给 [].filter 比较器应返回将作为过滤器的函数。

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

}

假设我通过以下方式获得此功能:

  var filterFn = comparator.apply({}, /(.+)(=|>=|<=|<|>|!=|==|!==)(.+)/.exec( "id<4" ).slice(1) );


someModel = someModel.objects.filter( filterFn );

它将寻找的目标:

   someModel.get = function( filter ){ 
return new Model(
this.objects.filter(
comparator.apply({}, /(.+)(=|>=|<=|<|>|!=|==|!==)(.+)/.exec( "id<4" ).slice(1)
)
);
};
var filtered = someModel.get( "id<4" );

问题是 - 我假设它会有更多的运算符,但我不知道如何更简单地编写它。

使用 Eval 是不可能的。

这段代码并没有被执行和测试我写它只是为了表明我的意思。

最佳答案

将每个函数存储在一个对象中,可以是预定义的,也可以是动态的。

如果您想动态创建函数集,请定义 comparator 对象,如下所示。我假设您没有扩展 Object.prototype。如果这样做,则必须在第一个循环中使用 operators.hasOwnProperty(property)

// Run only once
var funcs = {}; // Optionally, remove `funcs` and swap `funcs` with `operators`
var operators = { // at the first loop.
'>=': '>=',
'<=': '<=',
'<' : '<',
'>' : '>',
'=' : '==', //!!
'==':'===', //!!
'!=': '!='
}; // Operators

// Function constructor used only once, for construction
for (var operator in operators) {
funcs[operator] = Function('a', 'c',
'return function() {return this[a] ' + operator + ' c};');
}

// Run later
var comparator = function(a, b, c) {
return typeof funcs[b] === 'function' ? funcs[b](a, c) : null;
};

comparator 被调用时,返回的函数如下所示:

function() {  return this[a] < c;   }// Where a, c are pre-determined.

这个方法可以这样实现( demo at JSFiddle ):

// Assumed that funcs has been defined
function implementComparator(set, key, operator, value) {
var comparator, newset = [], i;

if (typeof funcs[operator] === 'function') {
comparator = funcs[operator](key, value);
} else { //If the function does not exist...
throw TypeError("Unrecognised operator");
}

// Walk through the whole set
for (i = 0; i < set.length; i++) {
// Invoke the comparator, setting `this` to `set[i]`. If true, push item
if (comparator.call(set[i])) {
newset.push(set[i]);
}
}
return newset;
}
var set = [ {meow: 5}, {meow: 3}, {meow: 4}, {meow: 0}, {meow: 9}]
implementComparator( set , 'meow', '<=', 5);
// equals: [ {meow: 5}, {meow: 3}, {meow: 4}, {meow: 0} ]

为了澄清,我构建了这个答案,同时牢记以下几点:

  • OP 要求使用一组未知/动态运算符的简单、易于扩展的方法。
  • 该代码基于 OP 中的伪代码,未更改任何可能影响 OP 意图的内容。通过一些调整,这个函数也可以用于Array.prototype.filter。或 Array.prototype.sort .
  • eval(或 Function)不应在每次调用 comparator
  • 时使用

关于javascript - 我该如何优化这个 switch 语句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8770099/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com