现在面试时候,还会时常提到数组去重问题,借着休息的这几天自己也总结一下,不求全面只求简单易懂的几个去重方法吧。
Array.prototype.uniqueA = function(){ var result = []; var isRepetition; for(var i=0; i<this.length; i++){ isRepetition = false; for(var j=0; j<result.length; j++){ if(this[i] === result[j]){ isRepetition = true; break; } } if(!isRepetition){ result.push(this[i]); } } return result; }
第一个方法是另建一个结果数组,用来存储原始数组中不重复的数据。遍历原始数组依次跟结果数组中的元素进行比较,检测是否重复。
Array.prototype.uniqueB = function(){ var result = []; for(var i=0; i<this.length; i++){ if(result.indexOf(this[i]) == -1){ result.push(this[i]); } } return result; }
第二个方法是比较通俗一下了,用了indexOf方法,indexOf 方法的意思是搜索整个数组中具有给定值的元素,返回找到的第一个元素的索引,没有找到就返回 -1 。这个代码也相对的少一些,至于运行效率,这个我不清楚,应该不高。
Array.prototype.uniqueC = function(){ var result = []; for(var i=0; i<this.length; i++){ for(var j=i+1; j<this.length; j++){ if(this[i] === this[j]){ j = ++i; } } result.push(this[i]); } return result; }
第三个方法的原理是第一层从前往后遍历原始数组,第二层循环是检测每个元素是否跟它之后的元素重复,如果它之后有重复元素则跳过它;如果这个元素之后所有元素都跟他不重复了,则把它添加到结果数组中。这个方法实现思路就是:获取无重复的最右一值添加到结果数组中,这个跟第一种方法相比也优化了第二层的循环,效率要比它高,不过这个方法的结果数组中元素的顺序跟原始数组中元素的顺序不一样了,嘻嘻 可以自己琢磨下,这个方法我也不是很理解,但是也属于精简路线。
Array.prototype.uniqueD = function(){ this.sort(); var result = [this[0]]; for(var i=1; i<this.length; i++){ if(this[i] !== result[result.length-1]){ result.push(this[i]); } } return result; }
最后一个方法是先把数组进行排序,,然后再进行去重工作。好啦,整理的都是代码比较短的数组去重方法,希望能帮到你们。