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

我的初始解决方案适用于过滤器函数(在@BoltClocktr修复之后),但后来我想在过滤器中使用选择器而不是函数来做同样的事情。在发现filter()返回一个新的 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 源代码,但我需要一些时间才能弄清楚其中发生了什么!)

于 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 回答