2012-07-01 31 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