0

私のコレクションには次の関数があります:

getFiltered: function (status, city) {
        return this.filter(function (trainer) {
            return ((status === null) ? trainer : trainer.get("TrainerStatusName") === status) &&
                    ((city === null) ? trainer : trainer.get('City') === city);
        });
    }

渡されたnull許容パラメータを処理するための最良の方法は何ですか。つまり、都市がnullの場合は、filter / fetch allを無視し、statusがnullの場合は、filter /fetchallを無視します。

上記のコードは機能しますが、代替案に興味があります

4

1 に答える 1

0

さて、最初に、私はあなたの質問に少し混乱しています。タイトルには「null許容」パラメーターの処理について書かれていますが、コードは「特殊なケース」パラメーター(具体的には「すべて」)を処理しているように見えます...トレーナーがnullの場合を除いて、私はそうは思いませんバックボーンコレクションを反復処理する場合でも可能です。

**編集** OPが質問を更新したため、上記は関係ありなくなりました。それに応じて回答も更新しました。

いずれにせよ、あなたのコードには何も悪いことや異常なことは何もありません。三項演算子は、1回限りの特殊なケースを処理する標準的な方法です。ただし、別のアイデアを探している場合は、追加の関数を使用してコードをドライアウト(重複を排除)するものを次に示します。

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について話しているので、null/undefinedのより単純なケースにはより良いパターンがあることを指摘する価値があります。たとえば、都市をフィルタリングするだけの場合、コードは次のようになります。

getFiltered: function (expectedCity) {
    return this.filter(function (currentCity) {
        return expectedCity === (currentCity || expectedCity);
}

言い換えると、Javascriptの「真実性」と、論理和(つまり||)ブール式が最初の真実性の値を返すという事実を利用できます。これにより、3値の必要がなくなり、多くのライブラリはこのパターンを使用して、提供されていない引数を入力します。たとえば、何も提供されていない場合に「target」引数を新しいオブジェクトに設定するjQueryの行を次に示します。

target = arguments[1] || {};

ただし、残念ながら、trainer.get('foo')オブジェクトだけでなく、物事のプロパティ/属性(例)を直接処理する場合(例trainer)、(関数を作成する以外に)使用できる適切なショートカットはありません。

于 2012-07-01T18:21:38.460 に答える