在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 */
部分提供给一个过滤器。一个用于匹配,一个用于其他 - 无需过滤两次。我错过了一个jQuery函数吗?
P.S。:我想我能做到:
$("some selector").each(function() {
// determine result...
if (result)
/* do something */
else
/* do something else */
});
但我希望有更好的东西。
答案 0 :(得分:16)
Kobi以插件形式推荐的方法:
$.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()
。
答案 1 :(得分:10)
我通常会使用not
- 它可以使用一系列元素并从您的选择中删除它们,为您留下补充:
var all = $("some selector");
var filtered = all.filter(function() {
// determine result...
return result;
});
var others = all.not(filtered);
答案 2 :(得分:1)
您可以尝试编写一个jQuery插件来执行此操作。查看过滤器功能的代码,并提出更准确的功能。它可能是这样的:
$("some selector").processList(predicate, successCallback, failureCallback);
然后你会传入三个回调函数:一个评估一个对象以查看它是否与过滤器选择匹配(你也可以接受选择器字符串等);一个处理与选择匹配的对象,另一个处理不匹配的对象。
答案 3 :(得分:1)
我不知道这是否更好,但使用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集$()
开始,然后使用add()
使用非过滤结果填充它,但无法使其正常工作。
修改强>
根据 Tomalak 的建议更新为直接在空的jQuery对象上使用push。
答案 4 :(得分:1)
$.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设置在每个内部更具可读性。
答案 5 :(得分:0)
有趣的问题。我看到你倾向于我的建议:
$("some selector").each(function() {
if ($(this).is(SOMEFILTER)) {
// do something
} else {
// do something
}
// continue with things that apply to everything
});