<!DOCTYPE html>
<html>
<head>
<title>Array delete duplicate</title>
</head>
<body>
</body>
</html>
<script>
/**
* 实现一
* 最容易想到的, 通过两个循环对比返回
* 正因为使用了两个循环, 因此在最差的情况下, 时间复杂度是O(n^2)
*/
var arr = [1,1,2,2,3,3,4,5,];
Array.prototype.unique1 = function () {
var newArr = [],
len = this.length,
i,j,
isrepeat;
for(i = 0; i< len; i++) {
isrepeat = false;
for(j = 0; j < newArr.length; j++) {
if(this[i] == newArr[j]) {
isrepeat = true;
break; //退出当前整个循环
}
}
if(!isrepeat) {
newArr.push(this[i]);
}
}
return newArr;
}
console.log("unique1: " + arr.unique1() );
/**
* 实现二
* 使用了Array的indexOf方法, 减少了一次循环
* 虽然使用indexOf方法, 减少了一次循环, 但是indexOf方法浏览器的实现, 必定也是需要遍历数组的
* 但是通过浏览器内核的遍历必定是会比自己循环快得多的
*/
Array.prototype.unique2 = function() {
var newArr = [],
len = this.length,
i;
for(var i = 0; i < len; i++) {
if(newArr.indexOf(this[i]) > -1) {
continue; //退出本次循环
}
newArr.push(this[i]);
}
return newArr;
}
console.log("unique2: " + arr.unique2() );
/**
* 实现三
* 利用hash表快速查找元素是否存在
* 考虑到 hash[1] === hash["1"] 的情况, key添加了类型后缀
*/
Array.prototype.unique3 = function () {
var hash = {},
len = this.length,
key = null,
newArr = [],
i;
for(i = 0; i < len; i++) {
key = this[i] + "_" + (typeof this[i]);
if(hash[key]) {
continue; //退出本次循环,不执行接下来的代码
}
hash[key] = true;
newArr.push(this[i]);
}
console.log(hash)
return newArr;
}
console.log("unique3: " + arr.unique3() );
</script>