Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I select every pair of 2 sequential elements in jQuery?

Tags:

jquery

Can anyone please help me to work out how to achieve the following? I have a set of divs of unknown size. Each div has a class of .feature. I need to run a jQuery script to find all divs with .feature and then find all children as a series of pairs. Each pair will then be submitted to a further jQuery function.

For example:

1. <div.feature/>
2. <div.feature/>
3. <div.feature/>
4. <div.feature/>
5. <div.feature/>

The result should be that 1+2 and 3+4 get paired together such that I can then call another jQuery function on each of these individual sets.

I know that I can simply wrap each pair in an outer div and then find each wrapper divs children but I'd like to avoid changing the markup if possible.

like image 672
Brian Scott Avatar asked Mar 01 '10 19:03

Brian Scott


2 Answers

var pairs = [];
$('div.feature').each(function(i, div) {
  var i_over_2 = Math.floor(i / 2);
  if (!pairs[i_over_2]) pairs[i_over_2] = $();
  pairs[i_over_2] = pairs[i_over_2].add(div);
});
$.each(pairs, function(i, p) {
  p.doSomethingToAPair();
});

The idea is to build up an array of jQuery objects.

edit looks like 1.4 added "$()" to get an empty jQuery object.

edit again durr Javascript has floats :-)

Hey @Adam: if we had this jQuery extension (this is a toy version of course):

jQuery.fn.zip = function(s) {
  var o = $(s);
  return this.map(function(i, e) {
    return $(e).add($(o[i]));
  });
};

then we could build the "pairs" array like this:

var pairs = $('div.feature:even').zip('div.feature:odd');
like image 194
Pointy Avatar answered Nov 08 '22 07:11

Pointy


idea

$('div.feature:even').each(function(){
  var t = $(this);
  var paired = t.add( $('div.feature:eq('+(t.index()+1)+')', t.parent()) );
  //add to array, call function...
}

May need little tweaking in order to work for you - it's untested.

preview

http://jsbin.com/okize/7

like image 38
Adam Kiss Avatar answered Nov 08 '22 07:11

Adam Kiss