今天工作遇到此问题,尝试多个方法不尽人意,故此写个博客来总结一下如何在js中去除重复元素。
Array类型并没有提供去重复的方法,如果要把数组的重复元素干掉,那得自己想办法:
方法1:
Array.prototype.method1 = function(){ var arr[]; //定义一个临时数组 for(var i = 0; i < this.length; i++){ //循环遍历当前数组 //判断当前数组下标为i的元素是否已经保存到临时数组 //如果已保存,则跳过,否则将此元素保存到临时数组中 if(arr1.indexOf(this[i]) == -1){ arr.push(this[i]); } } return arr; }
方法2:
Array.prototype.method2 = function(){ var h{}; //定义一个hash表 var arr[]; //定义一个临时数组 for(var i = 0; i < this.length; i++){ //循环遍历当前数组 //对元素进行判断,看是否已经存在表中,如果存在则跳过,否则存入临时数组 if(!h[this[i]]){ //存入hash表 h[this[i]] = true; //把当前数组元素存入到临时数组中 arr.push(this[i]); } } return arr; }
方法3:
Array.prototype.method3 = function(){ //直接定义结果数组 var arr[this[0]]; for(var i = 1; i < this.length; i++){ //从数组第二项开始循环遍历此数组 //对元素进行判断: //如果数组当前元素在此数组中第一次出现的位置不是i //那么我们可以判断第i项元素是重复的,否则直接存入结果数组 if(this.indexOf(this[i]) == i){ arr.push(this[i]); } } return arr; }
方法4:
Array.prototype.method4 = function(){ //将数组进行排序 this.sort(); //定义结果数组 var arr[this[0]]; for(var i = 1; i < this.length; i++){ //从数组第二项开始循环遍历数组 //判断相邻两个元素是否相等,如果相等说明数据重复,否则将元素写入结果数组 if(this[i] !== arr[arr.length - 1]){ arr.push(this[i]); } } return arr; }
例如:
var arr = [112,112,34,'你好',112,112,34,'你好','str','str1']; alert(arr.method3());
方法1和方法3都用到了数组的indexOf()方法,此方法主要用来查找元素在数组中第一次出现的位置。比较浪费资源和时间。
方法2使用的是hash表,把已经出现过的元素通过下标形式写入到一个object内,下标的引用要比用数组indexOf()方法搜索节省时间。
方法4是先将数组排序,然后一次比较相邻的两个元素的值,排序使用的是js原生的sort()方法。
读者可以自行编写程序测试四种方法的效率如何。例如:首先利用随机函数生成一个50000长度的随机数数组,然后分别用四种方法进行执行,记录程序运行时间进行比较四种方法的优劣。
方法五、个人比较喜欢的一个函数
function unique(arr) { var result = [], isRepeated; for (var i = 0, len = arr.length; i < len; i++) { isRepeated = false; for (var j = 0, len = result.length; j < len; j++) { if (arr[i] == result[j]) { isRepeated = true; break; } } if (!isRepeated) { result.push(arr[i]); } } return result; }
总体思路是把数组元素逐个搬运到另一个数组,搬运的过程中检查这个元素是否有重复,如果有就直接丢掉。从嵌套循环就可以看出,这种方法效率极低。我们可以 用一个hashtable的结构记录已有的元素,这样就可以避免内层循环。恰好,在Javascript中实现hashtable是极为简单的,改进如下:
function unique(arr) { var result = [], hash = {}; for (var i = 0, elem; (elem = arr[i]) != null; i++) { if (!hash[elem]) { result.push(elem); hash[elem] = true; } } return result; }
完整测试代码
<script> var h_hewenqiArray = new Array(); h_hewenqiArray[0] = "jb51.net"; h_hewenqiArray[1] = "easysector"; h_hewenqiArray[2] = "jb51.net"; h_hewenqiArray[3] = "keleyi"; h_hewenqiArray[4] = "keleyi"; h_hewenqiArray[5] = "脚本之家"; h_hewenqiArray[6] = "jb51.net"; h_hewenqiArray[7] = "hoverclock"; h_hewenqiArray[8] = "yestop"; h_hewenqiArray[9] = 163; h_hewenqiArray[10] = "脚本之家"; h_hewenqiArray[11] = 163; h_hewenqiArray[12] = "hoverclock"; h_hewenqiArray[13] = "脚本之家"; var h_arrayLength = h_hewenqiArray.length; document.write("原始数组元素个数:"+h_arrayLength + "<br />"); for (var i = 0; i < h_arrayLength; i++) { document.write(h_hewenqiArray[i]+"<br />"); } function hovercUnique(arr) { var result = [], hash = {}; for (var i = 0, elem; (elem = arr[i]) != null; i++) { if (!hash[elem]) { result.push(elem); hash[elem] = true; } } return result; //http://jb51.net.com } var h_hewenqiResult = hovercUnique(h_hewenqiArray); var h_resultLength = h_hewenqiResult.length; document.write("<br />去重复后数组元素个数:" + h_resultLength + "<br />"); for (var i = 0; i < h_resultLength; i++) { document.write(h_hewenqiResult[i] + "<br />"); } </script>
以下是其它网友的补充
复制代码 代码如下: