JS陣列去重

2021-10-07 07:16:52 字數 2033 閱讀 8735

陣列去重是非常經典的問題了,不同的實現方法,效能要求差別非常大。

假設有這樣的陣列

去掉重複的項,只保留乙個

let arr =[0

,1,2

,2,3

,3,3

,4];

let filterarr =

unique

(arr)

filterarr =>[1

,1,1

,2,2

,2,3

,3];

使用雙for迴圈遍歷,大概思路。外層迴圈從陣列第0項開始遍歷,內層迴圈從第i+1項開始遍歷到陣列最後的位置,如果有重複的項就刪除。

const

unique

=(arr)

=>

}return arr;

}

這裡要特別注意的是j–這個操作,因為splice刪除陣列某一項會導致陣列挪位,如果出現連續重複的項,就會出現問題。

該方法非常消耗效能,時間複雜度為o(n^2)

2.通過物件屬性名唯一去重

思路是物件的屬性名唯一,重複的屬性名會被覆蓋,遍歷陣列的每一項,以物件屬性名的方式儲存,如果已經存在就刪去。

const

unique

=(arr)

=>

;for

(let i =

0; i < arr.length; i++

)// 第一次出現就儲存到物件中

obj[arr[i]

]= arr[i];}

return arr;

}

這種方式相對比較節省效能,但是有缺陷,想象一下如果屬性名為』1』和1,不論哪一種都會覆蓋彼此。

意思是:

如果陣列長這樣

let arr  =[0

,1,'1'

,'1',2

];console.

log(

unique

(arr));

//=> [0, 1, 2]

因為不論是數字型別還是字串型別,最終都以字串形式儲存入物件。

const

unique

=(arr)

=>

return item;

}

核心思想:利用indexof()在新陣列中查詢,如果不存在返回-1的特性。

利用indexof另外乙個特性,返回陣列中該值第一次出現的索引值,利用foreach每次迴圈的index匹配,如果是第一次出現的就壓入新陣列。

const

unique

=(arr)

=>})

return item;

}

但是indexof的內部實現原理也是for迴圈,所以跟雙for迴圈類似,都非常消耗效能。

es6也提供了一些方法更加簡潔。

對於set這個類,摘自mdn

連nan都能做到不重複!!

以上我們知道set中的元素是唯一的,也就是其包含的每個value是唯一的

const

unique

=(arr)

=>

[...

newset

(arr)];

// or

const

unique

=(arr)

=> array.

from

(new

set(arr)

);

array.from()方法就是將乙個類陣列物件或者可遍歷物件轉換成乙個真正的陣列,個人更喜歡展開運算子。

如果有更好的方法再來補充~

JS陣列去重,物件去重

例項1根據indexof去重,indexof的好處就是返回的是首次出現的位置,這樣後面即使出現的值一樣,也只能返回第一次出現的索引,當然這個只適用於簡單的陣列 物件陣列去重 const objarr const obj const newobjarr for let i 0 i objarr.len...

js 陣列去重

function unique arr if isrepeated return result 建立乙個新的陣列,迴圈原有的陣列,每取乙個數就迴圈判斷新建的陣列中是否有和這個相等的值,沒有則插入。方法簡單,但是有雙重迴圈,陣列大了之後效率低。所以能一次迴圈解決最好。var str new array...

JS 陣列去重

我總共想出了三種演算法來實現這個目的 array.prototype.unique1 function return n array.prototype.unique2 function r n為hash表,r為臨時陣列 for var i 0 i this.length i 遍歷當前陣列 retu...