3

与えられたのは、一連の条件を持つオブジェクトです:

var conditions = {
    even: function (i) { return i % 2 == 0; },

    greatherThan: function (i) { return i > 10; },

    inValidRange: function (i) {
        return i > 20 && i < 100;
    }
};

および 0 から 39 までの範囲の配列番号: var numbers = _.range(0, 40);.

numbers条件ごとに絞り込みたい。これを行うためにunderscore.jsを使用しました:

var result = _.filter(numbers, function(current) {

    return _.all(_.values(conditions), function(f) { 
        return f(current);
    });

});
// returns [ 22, 24, 26, 28, 30, 32, 34, 36, 38 ]

問題なく動作しますが、残念ながら、上記のコードは奇妙に見え、かなり混乱しています。

このコードを読みやすく理解しやすくするために、このコードを単純化するにはどうすればよいですか?

4

2 に答える 2

0

そのコードを書き直す必要はありません。名前付き関数に入れます:

function filterByConditions(values, conditions){
  return _.filter(values, function(current) {

    return _.all(_.values(conditions), function(f) { 
      return f(current);
    });

  });
}

関数内のコードはそれほど複雑ではなく、underscore.js に慣れている人を混乱させることはありません。必要に応じて、関数の本文にコメントを追加できます。いずれにせよ、関数を別の場所で使用する場合は、名前から関数が何をするかが明確になるはずです。

var result = filterByConditions(numbers, conditions);

関数の本体を単純化したい場合は、underscore.js に慣れていない開発者でも読めるように、_alland_valuesを単純なfor ... inループに置き換えることができます。ほとんどの Javascript 開発者は、underscore.js を使用したことがなくても、_.filter の動作を推測できます

function filterByConditions(values, conditions){
  return _.filter(values, function(current){

    for(condition_name in conditions){

      if(!conditions[condition_name](current)){
        // Condition failed
        return false;
      }

    }

    // All conditions passed
    return true;

  });
}
于 2013-08-15T19:06:46.457 に答える