题目:去掉数组[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 ]
部分浏览器实现。