国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

js 數組去重的四種實用方法

2019-11-20 14:09:53
字體:
來源:轉載
供稿:網友

面試前端必須準備的一個問題:怎樣去掉Javascript的Array的重復項。據我所知,百度、騰訊、盛大等都在面試里出過這個題目。這個問題看起來簡單,但是其實暗藏殺機。 考的不僅僅是實現這個功能,更能看出你對計算機程序執行的深入理解。

我總共想出了三種算法來實現這個目的:

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;}

其中第1種和第3種方法都用到了數組的indexOf方法。此方法的目的是尋找存入參數在數組中第一次出現的位置。很顯然,js引擎在實現這個方法的時候會遍歷數組直到找到目標為止。所以此函數會浪費掉很多時間。 而第2中方法用的是hash表。把已經出現過的通過下標的形式存入一個object內。下標的引用要比用indexOf搜索數組快的多。

為了判斷這三種方法的效率如何,我做了一個測試程序,生成一個10000長度的隨機數組成的數組,然后分別用幾個方法來測試執行時間。 結果表明第二種方法遠遠快于其他兩種方法。 但是內存占用方面應該第二種方法比較多,因為多了一個hash表。這就是所謂的空間換時間。 就是這個測試頁面,你也可以去看看。

我寫了第四種方法:

Array.prototype.unique4 = function(){this.sort();var re=[this[0]];for(var i = 1; i < this.length; i++){if( this[i] !== re[re.length-1]){re.push(this[i]);}}return re;}

這個方法的思路是先把數組排序,然后比較相鄰的兩個值。 排序的時候用的JS原生的sort方法,JS引擎內部應該是用的快速排序吧。 最終測試的結果是此方法運行時間平均是第二種方法的三倍左右,不過比第一種和第三種方法快了不少。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 玉山县| 苏尼特左旗| 柳州市| 曲沃县| 喀什市| 荆州市| 芦山县| 阿坝| 晋中市| 金寨县| 遂平县| 池州市| 中阳县| 巴青县| 襄垣县| 尼木县| 兖州市| 奉贤区| 巴彦淖尔市| 藁城市| 山西省| 托克托县| 陵水| 固镇县| 卫辉市| 蕉岭县| 台江县| 青神县| 惠州市| 通河县| 清苑县| 大荔县| 桂林市| 绥滨县| 佛学| 绥中县| 赤壁市| 忻城县| 青岛市| 固安县| 荥阳市|