Array.unique

Benchmark created by Ryan Grove on


Preparation HTML

<script>
  var states = ["Alabama", "Alaska", "Arizona", "Arkansas", "California", "Colorado", "Connecticut", "Delaware", "Florida", "Georgia", "Hawaii", "Idaho", "Illinois", "Indiana", "Iowa", "Kansas", "Kentucky", "Louisiana", "Maine", "Maryland", "Massachusetts", "Michigan", "Minnesota", "Mississippi", "Missouri", "Montana", "Nebraska", "Nevada", "New Hampshire", "New Jersey", "New Mexico", "New York", "North Dakota", "North Carolina", "Ohio", "Oklahoma", "Oregon", "Pennsylvania", "Rhode Island", "South Carolina", "South Dakota", "Tennessee", "Texas", "Utah", "Vermont", "Virginia", "Washington", "West Virginia", "Wisconsin", "Wyoming", "Alabama", "Alaska", "Arizona", "Arkansas", "California", "Colorado", "Connecticut", "Delaware", "Florida", "Georgia", "Hawaii", "Idaho", "Illinois", "Indiana", "Iowa", "Kansas", "Kentucky", "Louisiana", "Maine", "Maryland", "Massachusetts", "Michigan", "Minnesota", "Mississippi", "Missouri", "Montana", "Nebraska", "Nevada", "New Hampshire", "New Jersey", "New Mexico", "New York", "North Dakota", "North Carolina", "Ohio", "Oklahoma", "Oregon", "Pennsylvania", "Rhode Island", "South Carolina", "South Dakota", "Tennessee", "Texas", "Utah", "Vermont", "Virginia", "Washington", "West Virginia", "Wisconsin", "Wyoming"],
      results;
  
  var lastIndexOf = Array.prototype.lastIndexOf ?
  function(a, val, fromIndex) {
   return fromIndex || fromIndex === 0 ? a.lastIndexOf(val, fromIndex) : a.lastIndexOf(val);
  } : function(a, val, fromIndex) {
   var len = a.length,
       i = len - 1;
  
   if (fromIndex || fromIndex === 0) {
    i = Math.min(fromIndex < 0 ? len + fromIndex : fromIndex, len);
   }
  
   if (i > -1 && len > 0) {
    for (; i > -1; --i) {
     if (a[i] === val) {
      return i;
     }
    }
   }
  
   return -1;
  };
  
  function unique_yui320(a) {
   var b = a.slice(),
       i = 0,
       n = -1,
       item = null;
  
   while (i < b.length) {
    item = b[i];
    while ((n = lastIndexOf(b, item)) !== i) {
     b.splice(n, 1);
    }
    i += 1;
   }
   return b;
  }
  
  function unique_yuinew(a) {
   var i = 0,
       len = a.length,
       results = [],
       item, j;
  
   for (; i < len; ++i) {
    item = a[i];
  
    // This loop iterates over the results array in reverse order and stops
    // if it finds an item that matches the current input array item (a
    // dupe). If it makes it all the way through without finding a dupe, it
    // pushes the current input item onto the end of the results array and
    // stops iterating.
    for (j = results.length; j > -1 || (results.push(item) && 0); --j) {
     if (item === results[j]) {
      break;
     }
    }
   }
   return results;
  }
  
  function unique_yuinew2(a) {
   var i = 0,
       len = a.length,
       results = [],
       item, j;
  
   for (; i < len; ++i) {
    item = a[i];
  
    for (j = results.length; j > -1; --j) {
     if (item === results[j]) {
      break;
     }
    }
  
    if (j === -1) {
     results.push(item);
    }
   }
   return results;
  }
</script>

Test runner

Ready to run.

Testing in
TestOps/sec
YUI 3.2.0 style
results = unique_yui320(states);
ready
YUI 3.3.0+ style
results = unique_yuinew(states);
ready
YUI 3.3.0+ style (more readable)
results = unique_yuinew2(states);
ready

Revisions

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

  • Revision 1: published by Ryan Grove on
  • Revision 3: published by stagas on