0

私はテーブルを持っています。特定の基準を満たすすべての行を選択し、それらで何かを行い、それから他のすべての行で別のことをしたいと考えています。したがって、行を 2 つの補完的なセットに分割する必要があります。これを行うための最良の(最速の)方法は何ですか?以下のコードはうまくいくと思いますが、より良い解決策はありますか?

var firstSetOfRows = $(".classA");
var allTheOtherRows = $(":not(.classA)");
firstSetOfRows.filter(function() {
        if (decisionFunctionA(this)) {
            return true;
        } else {
            allTheOtherRows.add(this);
            return false;
        }
    }).filter(function() {
        if (decisionFunctionB(this)) {
            return true;
        } else {
            allTheOtherRows.add(this);
            return false;
        }
    });
4

2 に答える 2

0

私の最初の解決策は(@BoltClockのtr修正後)フィルター関数で問題なく機能しますが、関数の代わりにフィルターのセレクターを使用して同じことをしたいと思いました。元のJQueryオブジェクトを変更せずに、新しいJQueryオブジェクトを返すことを発見した後filter()、私はこれを思いつきました。(psおよびfs配列はデバッグ用であるため、各段階で通過または失敗した行の数を確認できます。)

function complementaryFilter(originalSet, fltrs, funcPass, funcFail) {
    var passes = $(originalSet), fails = $();
    var ps = [], fs = [];
    for(var i = 0, j = fltrs.length; i < j; i++) {
        fails = fails.add(passes.not(fltrs[i]).get());
        passes = passes.filter(fltrs[i]);
        ps[i] = passes.length;
        fs[i] = fails.length;
    };
    passes.each(funcPass);
    fails.each(funcFail);
}

ただし、これは行を2回ループします。1回notは失敗した行を取得し、もう1回filterは通過した行を取得します。セットの1回のパスで両方を取得したいと思います。(JQueryソースを調べてみましたが、そこで何が起こっているのかを理解するのに少し時間がかかります!)

于 2012-05-19T20:55:34.913 に答える
0
        $(".classA").removeClass('SelectedClassA NotSelectedClassA');

        $(".classA").each(function () {
            $(this).addClass(function () {
                return ((decisionFunctionA(this) && decisionFunctionB(this)) ? 'SelectedClassA' : 'NotSelectedClassA');
            });
        });

        $(".classA.SelectedClassA").css({ 'Color': 'red' });
        $(".classA.NotSelectedClassA").css({ 'Color': 'Blue' });
 //Or

    var firstSetOfRows = $(".classA");
    firstSetOfRows.filter(function() {
            if (decisionFunctionA(this) && decisionFunctionB(this)) {
                return true;
            } else {
                allTheOtherRows.add(this);
                return false;
            }
        });
于 2012-05-19T12:50:55.480 に答える