本文继上一篇文章《Javascript数组去重 方法总结》所写,主要讲一下上篇文章中的数组去重方法的性能问题,探讨一下那种方法性能最优。

关于JavaScript的数组去重方法,某人刚才也提供了一种方法,经测试性能上有不少优势,特贴代码如下:

// renenglish
function someone_uniq(a, strict) {
  var o = {},
    arr = [],
    key;
  for (var i = 0; i < a.length; ++i) {
    key = a[i];
    if (strict) {
      if (typeof a[i] == "number") {
        key = a[i] + ".number";
      }
      if (typeof a[i] == "string") {
        key = a[i] + ".string";
      }
    }
    if (!o[key]) {
      o[key] = true;
      arr.push(a[i]);
    }
  }
  return arr;
}

该方法,与怪飞的方法,性能上几乎不相上下,但经多次测试发现,及大数组的测试下也能看出该方法比之怪飞的方法还是稍微差了那么一点点,不过比我第一次写的要快30倍左右。

下面是jQuery中的数组去重方法jQuery.unique(),我做了一下简单的改写,以方便在此处直接使用,代码如下所示:

//jQuery中的数组去重方法,不太适于测试,性能啊性能,难道真的这么差吗?
function jquery_unique(arg) {
  var arg = arg.sort();
  for (var i = 1, j = arg.length; i < j; i++) {
    if (arg[i] === arg[i - 1]) {
      arg.splice(i--, 1);
    }
  }
  return arg;
}

该方法的思路:

  • 对数组排序,判断相邻的值是否相等
  • 如果相等,则用splice()删除相等的元素

恩,不过该方法的性能实在不敢恭维,我在FF下处理一个长度1000的数组,浏览器就直接死掉,而之前写的方法,均可以处理长度100000的数组。

最后是QWrap框架中的快速去重法,因代码有点长,不在此处贴代码了,可直接到测试页面中测试其性能。

最后,附上一个比较直观的性能测试页面:JavaScript数组去重性能测试