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

时间:2010-05-09 17:45:46

标签: 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 */部分提供给一个过滤器。一个用于匹配,一个用于其他 - 无需过滤两次。我错过了一个jQuery函数吗?


P.S。:我想我能做到:

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

但我希望有更好的东西。

6 个答案:

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