题目:去掉数组[4,3,"3",3,5,7,5]中的重复元素,返回[4,3,"3",5,7]
1(function() { 2 'use strict'; 3 function filter1(arr) { 4 var b = []; 5 arr.forEach(function(i) { 6 if (b.indexOf(i) == -1) { 7 b.push(i); 8 } 9 }); 10 return b; 11 } 12 13 function filter2(arr) { 14 var b = {}, c = []; 15 arr.forEach(function(i) { 16 b[i] = b[i] ? b[i] : {}; 17 var type = typeof i; 18 if (!b[i][type]) { 19 b[i][type] = true; 20 c.push(i); 21 } 22 }); 23 return c; 24 } 25 26 function filter3(arr) { 27 var s = new Set(); 28 arr.map(x => s.add(x)); 29 return s; 30 } 31 32 function timer(fn, arr) { 33 console.time('filter'); 34 fn.call(this, arr); 35 console.timeEnd('filter'); 36 } 37 38 function testArr(n) { 39 // var arr = [4,3,"3",3,5,7,5]; 40 var arr = []; 41 for (var i = 0; i < n; i++) { 42 arr.push(i); 43 arr.push(i + ""); 44 } 45 return arr; 46 } 47 48 for (var i = 1; i <= 100; i++) { 49 console.log(i * 10); 50 var arr = testArr(i * 10); 51 timer(filter1, arr); 52 timer(filter2, arr); 53 timer(filter3, arr); 54 } 55})();
当数组长度短的时候,经常filter1的速度快于filter2(例如题目中的数组,采用filter1相对比较快),当数组长度不断增长时,两种方式的差距就体现出来了。filter3速度最快,但是目前还不能广泛使用。
数组长度1000时:
- filter1: 28.24ms
- filter2: 1.81ms
- filter3: 0.42ms
可以感受一下。
有其它方法否?
ES6新特性
1var s = new Set(); 2[4, 3, "3", 3, 5, 7, 5].map(x => s.add(x)); 3console.log(s); 4 5Set [ 4, 3, "3", 5, 7 ]
部分浏览器实现。