如何将转换应用于jQuery匹配的每个元素并满足某些条件

时间:2014-04-10 20:09:15

标签: jquery

我有一个复选框列表。我想从每个复选框中获取下一个元素的文本,并将它们收集到一个新列表中。

如果有可能这样的话,我只是在徘徊:

var checked_all = $('.brand-chk').each().is(':checked') ? $(this).next().text() : continue;

实际上,我想这样做:

var checked_all = [];
$('.brand-chk').each(function(e) {
   if($(this).is(':checked')) {
      checked_all.push($(this).next().text());
   }
});

实际上,语法不正确,continue不可接受......这可以吗?

1 个答案:

答案 0 :(得分:1)

你可以将一些jQuery函数链接在一起得到这样的东西:

var checked_all = $('.brand-chk') // match all checkboxen
  .filter(':checked') // now let's only look at checked ones
  .map(function() { 
    return $(this).next().text(); // take next().text() from each element
  });

但是,因为.next()和大多数jQuery操纵器一样,对匹配列表中的每个元素起作用并返回结果元素的列表,你可以这样做:

var checked_all = $('brand-chk')
  .filter(':checked') 
  .next() // get list of next() applied to each element in the original list
  .map(function() { return $(this).text(); });

我们可以在原始选择器中移动filter以获得一些性能提升,特别是如果有很多未经检查的框:

var checked_all = $('brand-chk:checked') 
  .next() 
  .map(function() { return $(this).text(); });

最后,我们可以使用一些JS技巧来避免声明一个匿名函数:

var checked_all = $('brand-chk:checked').next().map($.fn.text);

但我不确定这比以前的版本更具可读性。