JavaScript中數(shù)組去重的12種方法
1、使用for循環(huán)嵌套,splice去重(ES5中最常用)
將數(shù)組中的每一個(gè)元素依次與其他元素作比較,發(fā)現(xiàn)重復(fù)元素,刪除。
2、使用indexOf()去重
indexOf() 方法可返回某個(gè)指定的字符串值在字符串中首次出現(xiàn)的位置。
如果沒(méi)有找到匹配的字符串則返回 -1。
注意:?indexOf() 方法區(qū)分大小寫(xiě)。
新建一個(gè)空的結(jié)果數(shù)組,for
循環(huán)原數(shù)組,判斷結(jié)果數(shù)組是否存在當(dāng)前元素,如果有相同的值則跳過(guò),不相同則push
進(jìn)數(shù)組。
3、使用數(shù)組中的filter()方法
4、使用空對(duì)象來(lái)記錄新數(shù)組中已經(jīng)存儲(chǔ)過(guò)的元素
利用對(duì)象的屬性不能相同的特點(diǎn)點(diǎn)進(jìn)行去重。(這種數(shù)組去重的方法有問(wèn)題,不建議用,有待改進(jìn))
5、使用Set()去重(ES6中最常用)
Set:不包含重復(fù)元素的值的集合。
Map:雙列集合,鍵值對(duì)。
Map與Object的區(qū)別:Object中的key只能是String類(lèi)型,而Map可以是任意數(shù)據(jù)類(lèi)型。
這種方法無(wú)法去掉“{}”空對(duì)象。
6、利用sort()去重
sort() 方法用于對(duì)數(shù)組的元素進(jìn)行排序。
排序順序可以是字母或數(shù)字,并按升序或降序。
默認(rèn)排序順序?yàn)榘醋帜干颉?/p>
注意:當(dāng)數(shù)字是按字母順序排列時(shí)"40"將排在"5"前面。
使用數(shù)字排序,你必須通過(guò)一個(gè)函數(shù)作為參數(shù)來(lái)調(diào)用。
函數(shù)指定數(shù)字是按照升序還是降序排列。
注意:?這種方法會(huì)改變?cè)紨?shù)組!
利用sort()
排序方法,然后根據(jù)排序后的結(jié)果進(jìn)行遍歷及相鄰元素比對(duì)。
7、使用includes去重(ES7)
includes() 方法用于判斷字符串是否包含指定的子字符串。
如果找到匹配的字符串則返回 true,否則返回 false。
注意:?includes() 方法區(qū)分大小寫(xiě)。
8、利用hasOwnProperty去重
hasOwnProperty() 方法是 Object 的原型方法(也稱實(shí)例方法),它定義在 Object.prototype 對(duì)象之上,所有 Object 的實(shí)例對(duì)象都會(huì)繼承 hasOwnProperty() 方法。
hasOwnProperty() 方法用來(lái)檢測(cè)一個(gè)屬性是否是對(duì)象的自有屬性,而不是從原型鏈繼承的。如果該屬性是自有屬性,那么返回 true,否則返回 false。換句話說(shuō),hasOwnProperty() 方法不會(huì)檢測(cè)對(duì)象的原型鏈,只會(huì)檢測(cè)當(dāng)前對(duì)象本身,只有當(dāng)前對(duì)象本身存在該屬性時(shí)才返回true。
9、利用遞歸去重
10、利用Map數(shù)據(jù)結(jié)構(gòu)去重
創(chuàng)建一個(gè)空Map
數(shù)據(jù)結(jié)構(gòu),遍歷需要去重的數(shù)組,把數(shù)組的每一個(gè)元素作為key
存到Map
中,由于Map中不會(huì)出現(xiàn)相同的key
值,所以最終得到的就是去重后的結(jié)果。
11、利用 reduce 去重(適合累加、累乘)
12、[…new Set(arr)]去重
第五種簡(jiǎn)化版。