在集合上具有以下功能:
getFiltered: function (status, city) {
return this.filter(function (trainer) {
return ((status === null) ? trainer : trainer.get("TrainerStatusName") === status) &&
((city === null) ? trainer : trainer.get('City') === city);
});
}
处理可传入的可空参数的最佳方法是什么,即如果city为null则忽略filter / fetch all,如果status为null则忽略filter / fetch all
上面的代码有效,但对替代品感到好奇
答案 0 :(得分: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”参数设置为新对象:
target = arguments[1] || {};
不幸的是,当你处理事物的属性/属性(例如trainer.get('foo')
)而不是直接处理对象(例如trainer
)时,你可以使用没有好的捷径(其他而不是制作一个功能。)