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

Tom*_*lak 13 jquery filter

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

这将列表分为两部分.使用元素的"好半部分"很容易:

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

但是我怎样才能使用我的元素的"另一半" - 但是没有做相当于这个:

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

基本上,我想将两个独立的/* do something */部件送入一个过滤器.一个用于匹配,一个用于其他 - 无需过滤两次.我错过了一个jQuery函数吗?


PS:我想我能做到:

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

但我希望有更好的东西.

Tgr*_*Tgr 16

Kobi以插件形式推荐的方法:

$.fn.invert = function() {
  return this.end().not(this);
};

$('.foo').filter(':visible').hide().invert().show();
Run Code Online (Sandbox Code Playgroud)

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

$('.foo').filter(':visible').invert().end(); // this will yield $('.foo'), not $('.foo:visible')
Run Code Online (Sandbox Code Playgroud)

编辑:改变prevObjectend()在托默勒格的建议.


Kob*_*obi 10

我通常使用not它 - 它可以采用一系列元素并从您的选择中删除它们,为您留下补充:

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