好吧,首先,我对你们有点困惑题;标题说它处理“可空”参数,但你的代码看起来像处理“特殊情况”参数(特别是“所有”)...除了培训师为空的情况,但我不认为在迭代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
),没有很好的捷径可以使用(除了制作功能)。
感谢您的回复。我发布问题后实际更新了代码。现在修改它以适应问题。 – Chev