Paste_Image.png
直接上代碼,代碼注釋詳細
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>demo4</title>
<style>
.g{
background-color: green;
height:5px;
display:inline-block;
}
</style>
</head>
<body>
<div>
<div id="unique1">
<label>unique1</label>
<div class="g"></div>
</div>
<div id="unique2">
<label>unique2</label>
<div class="g"></div>
</div>
<div id="unique3">
<label>unique3</label>
<div class="g"></div>
</div>
<div id="unique4">
<label>unique4</label>
<div class="g"></div>
</div>
</div>
<script>
Array.prototype.unique1 = function()
{
var n = []; //一個新的臨時數組
for(var i = 0; i < this.length; i++) //遍歷當前數組
{
//如果當前數組的第i已經保存進了臨時數組,那么跳過,
//否則把當前項push到臨時數組里面
if (n.indexOf(this[i]) == -1) n.push(this[i]);
}
return n;
}
Array.prototype.unique2 = function()
{
var n = {},r=[]; //n為hash表,r為臨時數組
for(var i = 0; i < this.length; i++) //遍歷當前數組
{
if (!n[this[i]]) //如果hash表中沒有當前項
{
n[this[i]] = true; //存入hash表
r.push(this[i]); //把當前數組的當前項push到臨時數組里面
}
}
return r;
}
Array.prototype.unique3 = function(){
var n = [ this[ 0 ] ]; //結果數組
for( var i = 1; i < this.length; i++ ) //從第二項開始遍歷
{
//如果當前數組的第i項在當前數組中第一次出現的位置不是i,
//那么表示第i項是重復的,忽略掉。否則存入結果數組
if( this.indexOf( this[ i ] ) == i ) n.push( this[ i ] );
}
return n;
}
Array.prototype.unique4 = function(){
//數組排序
this.sort();
var re = [ this[ 0 ] ];
for( var i = 1; i < this.length; i++ )
{
//取數組的第i項和臨時數組的最后一項目對比,如果不等,就存入臨時數組。
if( this[ i ] !== re[ re.length - 1 ] )
{
re.push( this[ i ] );
}
}
return re;
}
//隨機生成數組
function randomArr(num){
var arr = [];
for( var i = 0; i < num; i++ )
{
//隨機生成1-num之間的數字
arr.push( Math.floor( Math.random() * num ) + 1 );
}
return arr;
}
function cuttime(idname){
var sTime = new Date().getTime();
//調用數組去重的方法
arr[idname]&&arr[idname]();
var eTime = new Date().getTime();
var _time = eTime-sTime;
//改變橫條的長度
document.getElementById(idname).children[1].style.width = _time+"px";
}
//隨機生成1-10000的數字的數組
var arr = randomArr(10000);
cuttime("unique1");
cuttime("unique2");
cuttime("unique3");
cuttime("unique4");
</script>
</body>
</html>
總結:結果表明第二種方法遠遠快于其他兩種方法。 但是內存占用方面應該第二種方法比較多,因為多了一個hash表。這就是所謂的空間換時間。