Js面试题(一)--js实现数组去重怎么实现?

方法1、创建一个新的临时数组来保存数组中已有的元素
方法2、使用哈希表存储已有元素
方法3、使用indexof判断数组元素第一次出现的位置是否为当前位置
方法4、先排序再去重
 
第一种方法和第三种方法都使用了indexof(),这个函数的执行机制也会遍历数组
第二种使用了哈希表,是最快的
第三种也有一个排序的复杂度的计算
 
详细代码如下:
  1 <!-- js实现数组去重 
  2     方法1、创建一个新的临时数组来保存数组中已有的元素
  3     -->
  4     <!-- js实现数组去重 
  5     方法2、使用哈希表存储已有元素
  6     -->
  7     <!-- js实现数组去重 
  8     方法3、使用indexof判断数组元素第一次出现的位置是否为当前位置
  9     -->
 10     <!-- js实现数组去重 
 11     方法4、先排序再去重
 12     -->
 13     <!-- 随机生成100万个0-1000的数组结果
 14         方法一执行时间:240
 15         方法二执行时间:5
 16         方法三执行时间:477
 17         方法四执行时间:246
 18         第三种方法总是第二种方法的将近两倍,而第四种方法与数组的范围有关
 19 
 20         如果是-100的数组
 21         方法一执行时间:40
 22         方法二执行时间:4
 23         方法三执行时间:64
 24         方法四执行时间:176
 25 
 26         而如果是0-10000
 27         方法一执行时间:2199
 28         方法二执行时间:6
 29         方法三执行时间:4876
 30         方法四执行时间:298
 31         第二种方法是最好的,,,但是是以空间换时间
 32     -->
 33 
 34     <script>
 35         var a = [];
 36         for (var i = 0; i < 1000000; i++) {
 37             a.push(Math.ceil(Math.random() * 10000));
 38         }
 39         Array.prototype.unique1 = function() {
 40             var n = []; //临时数组
 41             for (var i = 0; i < this.length; i++) {
 42                 //如果当前数组的第i已经保存进了临时数组,那么跳过
 43                 if (n.indexOf(this[i]) == -1) {
 44                     n.push(this[i]);
 45                 }
 46             }
 47             return n;
 48         }
 49         Array.prototype.unique2 = function() {
 50             var hash = [],
 51                 n = []; //hash哈希表,n临时数组
 52             for (var i = 0; i < this.length; i++) {
 53 
 54                 if (!hash[this[i]]) { //如果hash表中没有当前项
 55                     hash[this[i]] = true; //存入哈希表
 56                     n.push(this[i]); //当前元素push到临时数组
 57                 }
 58             }
 59             return n;
 60         }
 61         Array.prototype.unique3 = function() {
 62             var n = [this[0]];
 63             for (var i = 1; i < this.length; i++) {
 64                 //如果当前数组元素在数组中出现的第一次的位置不是i
 65                 //说明是重复元素
 66                 if (this.indexOf(this[i]) == i) {
 67                     n.push(this[i]);
 68                 }
 69             }
 70             return n;
 71         }
 72         Array.prototype.unique4 = function() {
 73             this.sort(function(a, b) {
 74                 return a - b;
 75             });
 76             var n = [this[0]];
 77             for (var i = 1; i < this.length; i++) {
 78                 if (this[i] != this[i - 1]) {
 79                     n.push(this[i]);
 80                 }
 81             }
 82             return n;
 83         }
 84         var begin1 = new Date();
 85         a.unique1();
 86         var end1 = new Date();
 87         console.log('方法1的执行时间:' + (end1 - begin1));
 88         var begin2 = new Date();
 89         a.unique2();
 90         var end2 = new Date();
 91         console.log('方法2的执行时间:' + (end2 - begin2));
 92         var begin3 = new Date();
 93         a.unique3();
 94         var end3 = new Date();
 95         console.log('方法3的执行时间:' + (end3 - begin3));
 96         var begin4 = new Date();
 97         a.unique4();
 98         var end4 = new Date();
 99         console.log('方法4的执行时间:' + (end4 - begin4));
100     </script>
四种方法执行时间如下:
 
就分享到这些,下次继续···
 

分享一下我的微信公众号,分享摄影与编程,谢谢大家的关注

猜你喜欢

转载自www.cnblogs.com/huihappy/p/10800727.html