5

標準の JavaScript で underscore.js の機能を再実装するためのプログラミングの課題に取り組んでいます。具体的には、_.some機能の実装に取り​​組んでいます。( http://underscorejs.org/#some ) 私が苦労している部分は、_.every内部的に使用して解決する方法を見つけるように求めていることです。( http://underscorejs.org/#every )

私はすでに_.every機能を以前に終了しており、正常に機能しています。

スケッチされたコードで私がやりたいことは論理的に次のとおりです。

_.some = function(collection, truthStatementFunction) { 
  return !(_every(collection, !truthStatementFunction)) 
}

または、英語では、真偽ステートメントを反転して、条件が偽である場所をテストします...そして、_.everyテストが真を返す場合...元の真偽ステートメントの一部が偽であることがわかります(したがって、戻り値を反転し_.everyて取得しますの正しい戻り値_some)。同様に、_.everyfalse を返す場合は、それを反転して true の正しい戻り値を取得します_.some

明らかに、このスケッチの問題は!truthStatementFunctionパーツです。そのイテレータの内部に入り、関数の内部を変更して反転させるにはどうすればよいですか? 関数の内部にアクセスできないようです...

私は完全に間違ったツリーを吠えていますか? を使用してこれを解決するより良い方法はあり_.everyますか?

4

1 に答える 1

9

_everyからの結果の反転を返す関数を渡しtruthStatementFunctionます。

_.some = function(collection, truthStatementFunction) { 
    return !(_every(collection, function(v) {
        return !truthStatementFunction(v);
    }));
}

質問の 2 番目の部分に答えるには:

_.every を使用してこれを解決するより良い方法はありますか?

を使用するよりも、これを解決するためのより良い方法が間違いなくあります_.every。コレクションを繰り返し処理し、一致する要素が見つかったらすぐに true を返します。_.someが true を返す場合には、述語を満たす要素がコレクション内にいくつあってもかまわないので、はるかに効率的です。

_.some = function(c, pred) { 
    for(var i = 0; i < c.length; i++) {
        if (pred(c[i])) return true;
    }
    return false;
}
于 2013-08-10T00:10:28.830 に答える