摘要:引言數組去重是前端面試的一個必備題目,其具體表現內容為怎樣去掉的的重復項。一般姿勢使用數組的方法可以很簡單的達到目的。所以這算是委曲求全的一種中庸姿勢。改編自劉春龍博客中的文章中數組去重問題
引言
數組去重是前端面試的一個必備題目,其具體表現內容為:怎樣去掉Javascript的Array的重復項。問題簡單直接,咱們也廢話不多說,直入主題吧。
一般姿勢使用數組的indexOf()方法可以很簡單的達到目的。
Array.prototype.unique = 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.unique = 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; }
JS引擎在實現indexOf()的時候會遍歷數組直到找到目標為止,此函數會浪費掉很多時間。所有這兩種方式都不是最優的解決方式。
// 另一個簡潔粗暴的方法 Array.prototype.unique = function() { return this.filter((v, i) => this.indexOf(v) === i) }
最快姿勢感謝oxyflour童鞋提供的簡單粗暴的一般姿勢ES6改良版,優雅而簡約 :)
把已經出現過的元素通過下標的形式存入一個Object內。下標的引用的實現原理利用的是哈希算法,要比用indexOf()搜索數組快的多。
Array.prototype.unique = function() { // n為hash表,r為臨時數組 var n = {}, r = []; for (var i = 0; i < this.length; i++) { // 如果hash表中沒有當前項 if (!n[this[i]]) { // 存入hash表 n[this[i]] = true; // 把當前數組的當前項push到臨時數組里面 r.push(this[i]); } } return r; }
但從耗時的角度來講,這是最優的一種解決方式。但是從內存占用角度來說,這并不是最優的,因為多了一個hash表。這就是所謂的空間換時間(世間安得雙全法?)。
中庸姿勢Array.prototype.unique = 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引擎內部應該是用的快速排序吧。這種方式比使用indexOf()的一般姿勢要快,比使用hash表的最快姿勢要慢,但是占用內存要少。所以這算是委曲求全的一種中庸姿勢。具體要用什么姿勢,各位看官視情況而定吧。
改編自劉春龍博客中的文章《JS中數組去重問題》
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/86181.html
摘要:編寫雙重循環去重當出現相同的元素時,刪除重復的元素哈希表形式查詢對象是否存在當前元素屬性借助方法查詢空數組里面是否已經存在這個值,不存在則推入編寫單元測試輸出通過來實現是比較優雅的姿勢。 編寫uniqueArray.js var Unique = { /** * 雙重循環去重 * @param arr * @returns {*} */ ...
摘要:使用進行操作,如下但是得到的其實是一個非常規的數組了,也就是說其實主要是用于對對象屬性的操作。這確實要根據自己的需求來了。當然簡單的實現如下好了到了這兒,我們開始總結下常用的數組去重的方法。 前言 我們先來看下面的例子,當然來源與網絡,地址《刪除數組中多個不連續的數組元素的正確姿勢》 我們現在將數組中所有的‘a’元素刪除: var arr = [a, a, b, c, d, a, a,...
摘要:基本操作數組去重寫在前面數組去重經常出現在前端招聘的筆試題里,比如有數組,請用實現去重函數,使得返回作為筆試題,考點有二正確。基本介紹文章主要是對數組去重的常用方法進行介紹。 js基本操作-數組去重 寫在前面 JavaScript 數組去重經常出現在前端招聘的筆試題里,比如: 有數組 var arr = [a, b, c, 1, 0, c, 1, , 1, 0],請用 JavaScr...
摘要:數組去重雙層循環使用雙層嵌套循環是最原始的方法用來存儲結果如果是唯一的,那么執行完循環,等于外層循環內層循環當和相等時,跳出循環。否則說明元素唯一,這時成立,將此元素添加到中。它類似于數組,但是成員的值都是唯一的,沒有重復的值。 JavaScript數組去重 雙層循環 使用雙層嵌套循環是最原始的方法: var array = [a,b,a]; function unique(arra...
閱讀 1875·2021-09-27 13:35
閱讀 3429·2019-08-30 14:16
閱讀 2483·2019-08-30 10:52
閱讀 859·2019-08-29 16:35
閱讀 1416·2019-08-29 15:22
閱讀 3641·2019-08-23 18:21
閱讀 3133·2019-08-23 18:00
閱讀 3123·2019-08-23 16:50