2012-07-01 36 views
0

对我收集以下功能:Backbone.js的:处理多为空的过滤器的最佳方法参数

getFiltered: function (status, city) { 
     return this.filter(function (trainer) { 
      return ((status === null) ? trainer : trainer.get("TrainerStatusName") === status) && 
        ((city === null) ? trainer : trainer.get('City') === city); 
     }); 
    } 

什么是对付如果城市是空,然后在IE通过为空的PARAMS最好的方法忽略过滤器/获取所有,如果状态为null,则忽略过滤器/获取所有

上述工程的代码,但好奇的替代品

回答

0

好吧,首先,我对你们有点困惑题;标题说它处理“可空”参数,但你的代码看起来像处理“特殊情况”参数(特别是“所有”)...除了培训师为空的情况,但我不认为在迭代Backbone集合时甚至可能。

* *编辑* OP更新的问题,因此上述不再相关。我也相应地更新了我的答案。

在任何情况下,你的代码都没有任何错误或不寻常的地方;三元运算符是处理一次性特殊情况的标准方法。如果您正在寻找替代的想法不过,这里有一个使用一个额外的功能,要干出(消除重复)代码:

function matchesOrAll(expected, actual) { 
    return expected === null || expected === actual; 
} 

getFiltered: function (status, city) { 
    return this.filter(function (trainer) { 
     return matchesOrAll(status, trainer.get("TrainerStatusName") && 
       matchesOrAll(city, trainer.get("City")); 
} 

* *编辑*

现在我们在谈论null而不是“all”时,值得指出的是,对于更简单的nulls/undefined情况,有一个更好的模式。如果你仅仅是要过滤的城市,例如,代码可能只是:

getFiltered: function (expectedCity) { 
    return this.filter(function (currentCity) { 
     return expectedCity === (currentCity || expectedCity); 
} 

换句话说,你可以采取JavaScript的“感实性”的优势,而事实上,选言(即||。)布尔表达式返回第一个真值。这消除了对三元组的需求,并且许多库使用这种模式来填充未提供的参数;举例来说,这里是从jQuery的一条线,设置了“目标”的说法到一个新的对象,如果没有提供:

target = arguments[1] || {}; 

但不幸的是,当你处理的事情(如trainer.get('foo')。)性质/属性而不是直接对象(例如,trainer),没有很好的捷径可以使用(除了制作功能)。

+0

感谢您的回复。我发布问题后实际更新了代码。现在修改它以适应问题。 – Chev