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 });