使用一系列过滤函数在jquery中获得2个互补集

时间:2012-05-19 12:43:51

标签: jquery jquery-selectors set

我有一张桌子。我想选择满足特定条件的所有行,对它们执行某些操作,然后对所有其他行执行其他操作。所以我需要将行分成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;
        }
    });

2 个答案:

答案 0 :(得分: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;
            }
        });

答案 1 :(得分:0)

我的初始解决方案适用于过滤器功能(在@ BoltClock的tr修复之后),但后来我想使用过滤器中的选择器而不是函数来做同样的事情。在发现filter()返回一个新的JQuery对象后,让原始的JQuery对象保持未突变状态,我就想出了这个。 (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);
}

但是,这会将行循环两次 - 一次使用not以获取失败的行,然后再使用filter来获取传递的行。我想在这一套中只获得一次。 (我试着查看JQuery源代码,但是我需要一些时间来弄清楚那里发生了什么!)