好吧,首先,我對你們有點困惑題;標題說它處理「可空」參數,但你的代碼看起來像處理「特殊情況」參數(特別是「所有」)...除了培訓師爲空的情況,但我不認爲在迭代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