1

この次のコードは、Backbone.js の Events#off()から取得したものです。

理解しやすいように IF 部分を単純化するにはどうすればよいですか?

for (i = list.length - 2; i >= 0; i -= 2) {
    if (!(callback && list[i] !== callback || context && list[i + 1] !== context)) {
        list.splice(i, 2);
    }
}
4

5 に答える 5

3
var noCallback = callback && list[i] !== callback;
var noContext = context && list[i + 1] !== context;
if(! noCallback && ! noContext){...}

または、コメントでアドバイスされているように否定を削除するには:

var callbackCheck = !callback || list[i] === callback;
var contextCheck = !context || list[i + 1] === context;
if(callbackCheck && contextCheck ){...}
于 2012-08-05T16:59:52.487 に答える
2

いくつかのブール演算:

!(callback && list[i] !== callback || context && list[i + 1] !== context)
!(!(!callback || list[i] === callback) || !(!context || list[i + 1] === context))
(!callback || list[i] === callback) && (!context || list[i + 1] === context)

否定接続法標準形よりも、選言標準形の方がはるかに理解しやすいと思います。

単一の部分を理解しやすくするために、話し言葉の変数名を使用します (これの範囲はわかりません。もっと良いものが見つかるかもしれません)。

var rightCallback = !callback || list[i] === callback;
var rightContext = !context || list[i + 1] === context;
if (rightCallback && rightContext) {…}
于 2012-08-05T17:15:31.003 に答える
0

ステートメントをわかりやすい名前の関数にカプセル化することをお勧めします(何をしたいのかわかりません)。

if (true == meaningfulConditionName(list, callback))
{
    list.splice(i, 2);
}
于 2012-08-05T17:01:17.323 に答える
0

これ以上単純化することはできません:

for (i = list.length - 2; i >= 0; i -= 2) callback && list[i] !== callback || context && list[i + 1] !== context || list.splice(i, 2)
于 2012-11-09T00:06:04.827 に答える
-1

これが私のバージョンで、すべての Backbone.js テストに合格し、元のバージョンよりも遅くなります。

  if(
      // callback defined, context is null
      // remove callback for all context
      ( callback && list[i] === callback
         && !context)

      // callback defined and context is defined
      // ie remove specified callback for specified context
      || ( callback && list[i] === callback
           && context && list[i+1] === context)

      // callback NOT defined and context is defined
      // ie removed all callback for specific context
      || ( !callback && list[i] !== callback
           && context && list[i+1] === context )

      // callback NOT defined and context NOT defined
      // i.e. removed everything, this is unreachable code
      // as it is caught by 
      // https://github.com/documentcloud/backbone/blob/master/backbone.js#L112
      // and https://github.com/documentcloud/backbone/blob/master/backbone.js#L103
      || ( !callback && !context )

      ) {

            // remove callback and context
            list.splice( i, 2 );
  }                          
于 2012-08-05T17:31:09.513 に答える