题目:去掉数组[4,3,"3",3,5,7,5]中的重复元素,返回[4,3,"3",5,7]
(function() { 'use strict'; function filter1(arr) { var b = []; arr.forEach(function(i) { if (b.indexOf(i) == -1) { b.push(i); } }); return b; } function filter2(arr) { var b = {}, c = []; arr.forEach(function(i) { b[i] = b[i] ? b[i] : {}; var type = typeof i; if (!b[i][type]) { b[i][type] = true; c.push(i); } }); return c; } function filter3(arr) { var s = new Set(); arr.map(x => s.add(x)); return s; } function timer(fn, arr) { console.time('filter'); fn.call(this, arr); console.timeEnd('filter'); } function testArr(n) { // var arr = [4,3,"3",3,5,7,5]; var arr = []; for (var i = 0; i < n; i++) { arr.push(i); arr.push(i + ""); } return arr; } for (var i = 1; i <= 100; i++) { console.log(i * 10); var arr = testArr(i * 10); timer(filter1, arr); timer(filter2, arr); timer(filter3, arr); } })();
当数组长度短的时候,经常filter1的速度快于filter2(例如题目中的数组,采用filter1相对比较快),当数组长度不断增长时,两种方式的差距就体现出来了。filter3速度最快,但是目前还不能广泛使用。
数组长度1000时:
- filter1: 28.24ms
- filter2: 1.81ms
- filter3: 0.42ms
可以感受一下。
有其它方法否?
ES6新特性
var s = new Set(); [4, 3, "3", 3, 5, 7, 5].map(x => s.add(x)); console.log(s); Set [ 4, 3, "3", 5, 7 ]
部分浏览器实现。