一般来说是建立一个哈希表,类似这样
var arr = [1, 2, 2, 3, 4, 5, 6, 6]; function getArray(a) { var hash = {}, len = a.length, result = []; for (var i = 0; i < len; i++){ if (!hash[a[i]]){ hash[a[i]] = true; result.push(a[i]); } } return result; } getArray(arr); // 输出[1, 2, 3, 4, 5, 6]
里面有对对象属性的查询,这个性能肯定不是最好的,所以问对js来说是否还有更加高效?
我对4种库进行了测试:
测试环境是Linux Sandybridge i5 x86-64下的chrome 26(下称v8)和firefox 20(下称ionmonkey)
测试数据有3种:
实验数据:
v8/
mkArr(3000, 3000)
v8/
mkMixedArr(3000, 3000)
v8/
mkObjArr(10000, 10000)
ionmonkey/
mkArr(3000, 3000)
ionmonkey/
mkMixedArr(3000, 3000)
ionmonkey/
mkObjArr(10000, 10000)
结论:
测试的不足
必须是原生的吗? jQuery里有个unique方法
underscorejs的效率好低,将之前的元素push入一个新数组,然后再每次判断元素是否已存在这个数组内。
underscorejs的代码如下:
jQuery的方法是先排序,然后从第二个元素开始只循环一次,每次和上一元素比较。 并且只记录需要删除的下标,然后删除原数组中的重复项,这样避免了元素太大而导致的效率问题,应该是最高效的了
jQuery的代码如下
http://underscorejs.org/#uniq
不建议自己写