我有一张桌子。我想选择满足特定条件的所有行,对它们执行某些操作,然后对所有其他行执行其他操作。所以我需要将行分成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;
}
});
答案 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源代码,但是我需要一些时间来弄清楚那里发生了什么!)