Backbone.js:处理多个可空过滤器参数的最佳方法

时间:2012-07-01 16:49:46

标签: 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);
        });
    }

处理可传入的可空参数的最佳方法是什么,即如果city为null则忽略filter / fetch all,如果status为null则忽略filter / fetch all

上面的代码有效,但对替代品感到好奇

1 个答案:

答案 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)时,你可以使用没有好的捷径(其他而不是制作一个功能。)