Sibling Index (v10)

Revision 10 of this benchmark created on


Preparation HTML

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>
<div id="insertHere"></div>

<script>
var insertHere = document.getElementById("insertHere");
for(var i = 0; i<50; i++) {
var div = document.createElement('DIV')
div.innerHTML = '1';
insertHere.appendChild(div);
}
var div = document.createElement('DIV')
div.innerHTML = '2';
div.id = 'whereami';
insertHere.appendChild(div);
</script>

Setup

function findRow(node) {
      var i = 1;
      while (node.previousSibling) {
        node = node.previousSibling;
        if (node.nodeType === 1) {
          i++;
        }
      }
      return i;
    }
    
    function findRow2(node) {
      return $(node).index();
    }
    
    function findRow3(node) {
      var i = 1;
      while (node = node.previousSibling) {
        if (node.nodeType === 1) {
          ++i
        }
      }
      return i;
    }
    
    function findRow4(node) {
      return [].indexOf.call(node.parentNode.children, node)
    }
    
    (function() {
      var fn = document.body.previousElementSibling ? 'previousElementSibling' : 'previousSibling'; // ie <=8 skips text nodes
    
      findRow5 = function(node) {
        var i = 1;
        while (node = node[fn]) {
          ++i
        }
        return i;
      }
    }());
    
    //previousSibling - good if there are no text nodes 
    findRow6 = function(node) {
      var i = 1;
      while (node = node.previousSibling) {
        ++i
      }
      return i;
    }
    //previousElementSibling - requires IE9+
    if (document.body.previousElementSibling) {
      findRow7 = function(node) {
        var i = 1;
        while (node = node.previousElementSibling) {
          ++i
        }
        return i;
      }
    }
    
    var node = document.getElementById('whereami'); //div node to find

Test runner

Ready to run.

Testing in
TestOps/sec
Original
findRow(node);
ready
jQuery
findRow2(node);
ready
Jack's one
findRow3(node);
ready
Using Array.indexOf
findRow4(node);
ready
using conditional function
findRow5(node);
ready
previousSibling - good if there are no text nodes
findRow6(node);
ready
previousSiblingAll - requires IE9+
findRow7(node);
ready

Revisions

You can edit these tests or add more tests to this page by appending /edit to the URL.