jQuery:使用filter(),但同时使用两个结果

在jQuery中, filter()将结果减少到满足特定条件的元素。

这将列表分为两部分。 使用元素的“好半部分”很容易:

 $("some selector").filter(function() { // determine result... return result; }).each( /* do something */ ); 

但是,我如何处理我的元素的“另一半” – 但没有做相当于这个

 $("some selector").filter(function() { // determine result... return !result; }).each( /* do something else */ ); 

基本上,我想给两个单独的/* do something */部分到一个filter。 一个用于匹配,一个用于其他 – 无需过滤两次。 我错过了一个jQuery函数吗?


PS:我想我能做到:

 $("some selector").each(function() { // determine result... if (result) /* do something */ else /* do something else */ }); 

但我希望有更好的东西。

Kobi以插件forms推荐的方法:

 $.fn.invert = function() { return this.end().not(this); }; $('.foo').filter(':visible').hide().invert().show(); 

请注意, invert()不会向jQuery堆栈添加新元素,而是替换最后一个:

 $('.foo').filter(':visible').invert().end(); // this will yield $('.foo'), not $('.foo:visible') 

编辑:在Tomalak的建议prevObject更改为end()

我通常not会这样做 – 它可以采用一系列元素并将其从您的选择中删除,留下您的补充:

 var all = $("some selector"); var filtered = all.filter(function() { // determine result... return result; }); var others = all.not(filtered); 

您可以尝试编写一个jQuery插件来执行此操作。 查看filterfunction的代码,并提出更准确的function。 它可能是这样的:

 $("some selector").processList(predicate, successCallback, failureCallback); 

然后你将传入三个回调:一个评估对象以查看它是否与filter选择匹配(你也可以接受选择器字符串等); 一个处理与选择匹配的对象,另一个处理不匹配的对象。

 $.fn.if = function(cond, ontrue, onfalse) { this.each(function() { if (cond.apply(this)) ontrue.apply(this); else onfalse.apply(this); }); }; $('some selector').if(function() { // determine result }, function() { // do something }, function() { // do something else }); 

不过,我不确定它是否比手动将if放在每个内部更具可读性。

我不知道这是否更好,但使用filter()你可以做类似的事情:

 var $others = $(); var $filtered = $('div').filter(function() { if(! your filter test) { $others.push(this); } else { return true; } }); alert($others.length); alert($filtered.length); 

编辑:

起初我尝试从一个空的jQuery set $() ,然后使用add()用非过滤结果填充它,但无法使其工作。

编辑:

更新为按照Tomalak的建议直接在空的jQuery对象上使用push。

有趣的问题。 我看到你倾向于我的建议:

 $("some selector").each(function() { if ($(this).is(SOMEFILTER)) { // do something } else { // do something } // continue with things that apply to everything });