js實現(xiàn)數(shù)組去重方法及效率對比
其實網(wǎng)上搜索這些方法一堆堆的,之所以還來寫一遍主要是因爲(wèi)自己習(xí)慣一種之後就忘了其他方法怎麼實現(xiàn),就寫一寫總結(jié)一下,順便做個測試看看哪個效率最高,爲(wèi)了更好展示效果,我會先總結(jié)認(rèn)爲(wèi)比較好的方法,後面統(tǒng)一測試。(溫馨提示:下文衹是爲(wèi)了簡便,一般情況下不建議寫在原型上,容易污染全局)
一,通過尋找對象屬性
var n = [14,12,2,2,2,5,32,2,59,5,6,33,12,32,6];
Array.prototype.unique1 = function(){
var obj = {},
ary = [],
i= 0,
len = this.length;
for(; i<len; i++){
if(!obj[this[i]]){
obj[this[i]] = 1;
ary.push(this[i]);
}
}
return ary.sort(function(a,b){return a - b});
}
console.log(n.unique1());
二,通過尋找數(shù)組位置
var n = [14,12,2,2,2,5,32,2,59,5,6,33,12,32,6];
Array.prototype.unique2 = function(){
var ary = [],
i= 0,
len = this.length;
for(; i<len; i++){
if(ary.indexOf(this[i]) == -1) ary.push(this[i]);
}
return ary.sort(function(a,b){return a - b});
}
console.log(n.unique2());
三,跟尋找數(shù)組位置類似,搜索數(shù)字第一次出現(xiàn)的位置是不是跟當(dāng)前位置一樣
var n = [14,12,2,2,2,5,32,2,59,5,6,33,12,32,6];
Array.prototype.unique3 = function(){
var ary = [],
i= 0,
len = this.length;
for(; i<len; i++){
if(this.indexOf(this[i]) == i) ary.push(this[i]);
}
return ary.sort(function(a,b){return a - b});
}
console.log(n.unique3());
四,比較常規(guī),先排序,再比較前後兩個數(shù)字是不是相等
var n = [14,12,2,2,2,5,32,2,59,5,6,33,12,32,6];
Array.prototype.unique4 = function(){
this.sort(function(a,b){return a - b});
var ary = [],
i= 0,
len = this.length;
for(; i<len; i++){
if(this[i] !== this[i-1]) ary.push(this[i]);
}
return ary;
}
console.log(n.unique4());
接下來是網(wǎng)上比較少的效率比較了,也是本文重點,我們先生成一個計時函數(shù)統(tǒng)一比較
首先生成一個一百數(shù)字的數(shù)組
Array.prototype.unique1 = function(){
var obj = {},
ary = [],
i= 0,
len = this.length;
for(; i<len; i++){
if(!obj[this[i]]){
obj[this[i]] = 1;
ary.push(this[i]);
}
}
return ary.sort(function(a,b){return a - b});
}
Array.prototype.unique2 = function(){
var ary = [],
i= 0,
len = this.length;
for(; i<len; i++){
if(ary.indexOf(this[i]) == -1) ary.push(this[i]);
}
return ary.sort(function(a,b){return a - b});
}
Array.prototype.unique3 = function(){
var ary = [],
i= 0,
len = this.length;
for(; i<len; i++){
if(this.indexOf(this[i]) == i) ary.push(this[i]);
}
return ary.sort(function(a,b){return a - b});
}
Array.prototype.unique4 = function(){
this.sort(function(a,b){return a - b});
var ary = [],
i= 0,
len = this.length;
for(; i<len; i++){
if(this[i] !== this[i-1]) ary.push(this[i]);
}
return ary;
}
function randomAry (n) {
var ary = [],i=0;
for(; i<n; i++){
ary.push(Math.ceil(Math.random()*10000));
}
console.log(ary)
return ary;
}
function useTime (fn) {
var start = new Date();
fn();
var end = new Date();
console.log('本次函數(shù)運行花了:' + (end - start) + '毫秒');
}
var ary = randomAry(100),
fn1 = function(){
ary.unique1()
},
fn2 = function(){
ary.unique2()
},
fn3 = function(){
ary.unique3()
},
fn4 = function(){
ary.unique4()
};
useTime(fn1);
useTime(fn2);
useTime(fn3);
useTime(fn4);
結(jié)果在我的谷歌瀏覽器發(fā)現(xiàn)
方法一:0毫秒
方法二:1毫秒
方法三:0毫秒
方法四:00毫秒
(嗯,果然現(xiàn)代瀏覽器強大無比,不吐槽舊瀏覽器了)
看看1000個數(shù)字
Array.prototype.unique1 = function(){
var obj = {},
ary = [],
i= 0,
len = this.length;
for(; i<len; i++){
if(!obj[this[i]]){
obj[this[i]] = 1;
ary.push(this[i]);
}
}
return ary.sort(function(a,b){return a - b});
}
Array.prototype.unique2 = function(){
var ary = [],
i= 0,
len = this.length;
for(; i<len; i++){
if(ary.indexOf(this[i]) == -1) ary.push(this[i]);
}
return ary.sort(function(a,b){return a - b});
}
Array.prototype.unique3 = function(){
var ary = [],
i= 0,
len = this.length;
for(; i<len; i++){
if(this.indexOf(this[i]) == i) ary.push(this[i]);
}
return ary.sort(function(a,b){return a - b});
}
Array.prototype.unique4 = function(){
this.sort(function(a,b){return a - b});
var ary = [],
i= 0,
len = this.length;
for(; i<len; i++){
if(this[i] !== this[i-1]) ary.push(this[i]);
}
return ary;
}
function randomAry (n) {
var ary = [],i=0;
for(; i<n; i++){
ary.push(Math.ceil(Math.random()*10000));
}
console.log(ary)
return ary;
}
function useTime (fn) {
var start = new Date();
fn();
var end = new Date();
console.log('本次函數(shù)運行花了:' + (end - start) + '毫秒');
}
var ary = randomAry(1000),
fn1 = function(){
ary.unique1()
},
fn2 = function(){
ary.unique2()
},
fn3 = function(){
ary.unique3()
},
fn4 = function(){
ary.unique4()
};
useTime(fn1);
useTime(fn2);
useTime(fn3);
useTime(fn4);
方法一:1-2毫秒
方法二:40-50毫秒
方法三:40-50毫秒
方法四:0-1毫秒
看看10000個數(shù)字(數(shù)據(jù)龐大,開始吃不消了,等個五六秒吧)
Array.prototype.unique1 = function(){
var obj = {},
ary = [],
i= 0,
len = this.length;
for(; i<len; i++){
if(!obj[this[i]]){
obj[this[i]] = 1;
ary.push(this[i]);
}
}
return ary.sort(function(a,b){return a - b});
}
Array.prototype.unique2 = function(){
var ary = [],
i= 0,
len = this.length;
for(; i<len; i++){
if(ary.indexOf(this[i]) == -1) ary.push(this[i]);
}
return ary.sort(function(a,b){return a - b});
}
Array.prototype.unique3 = function(){
var ary = [],
i= 0,
len = this.length;
for(; i<len; i++){
if(this.indexOf(this[i]) == i) ary.push(this[i]);
}
return ary.sort(function(a,b){return a - b});
}
Array.prototype.unique4 = function(){
this.sort(function(a,b){return a - b});
var ary = [],
i= 0,
len = this.length;
for(; i<len; i++){
if(this[i] !== this[i-1]) ary.push(this[i]);
}
return ary;
}
function randomAry (n) {
var ary = [],i=0;
for(; i<n; i++){
ary.push(Math.ceil(Math.random()*10000));
}
console.log(ary)
return ary;
}
function useTime (fn) {
var start = new Date();
fn();
var end = new Date();
console.log('本次函數(shù)運行花了:' + (end - start) + '毫秒');
}
var ary = randomAry(10000),
fn1 = function(){
ary.unique1()
},
fn2 = function(){
ary.unique2()
},
fn3 = function(){
ary.unique3()
},
fn4 = function(){
ary.unique4()
};
useTime(fn1);
useTime(fn2);
useTime(fn3);
useTime(fn4);
因爲(wèi)數(shù)據(jù)龐大,我衹拿一次數(shù)據(jù),你們喜歡就刷新幾次比較唄
方法一:10毫秒
方法二:1258毫秒
方法三:2972毫秒
方法四:5毫秒
原本還想給更大的數(shù)據(jù)看看,然後十萬個我的頁面就奔潰了。。。潰了。。。了
然後試試五萬個,也奔潰了。。。潰了。。。了
那就算吧,
反正在一萬個數(shù)據(jù)裏面對比,數(shù)據(jù)越大,方法一跟方法四按毫秒遞增,方法二跟方法三效率感人
效率計算:4>1>2>3
方法計算: 先排序,再比較前後兩個數(shù)字是不是相等 > 通過尋找對象屬性 > 通過尋找數(shù)組位置 > 搜索數(shù)字第一次出現(xiàn)的位置是不是跟當(dāng)前位置一樣
以上就是本文的全部內(nèi)容,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,同時也希望多多支持腳本之家!
相關(guān)文章
JavaScript學(xué)習(xí)小結(jié)(一)——JavaScript入門基礎(chǔ)
本教程比較適合javascript初學(xué)者,對javascript基本知識的小結(jié)包括變量,基本類型等知識點,需要的朋友一起來學(xué)習(xí)吧2015-09-09
Javascript Function對象擴展之延時執(zhí)行函數(shù)
這篇文章主要介紹 在js里面怎么延時執(zhí)行一個函數(shù)?2010-07-07
在javascript中執(zhí)行任意html代碼的方法示例解讀
關(guān)于javascript的eval()函數(shù)無法執(zhí)行html代碼的問題,下面為大家介紹下一種在javascript中執(zhí)行任意html代碼的方法,感興趣的朋友不要錯過2013-12-12
js實現(xiàn)瀏覽器窗口大小被改變時觸發(fā)事件的方法
這篇文章主要介紹了js實現(xiàn)瀏覽器窗口大小被改變時觸發(fā)事件的方法,實例分析了window.onresize方法的使用技巧,需要的朋友可以參考下2015-02-02

