最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JavaScript數(shù)組去重的幾種方法

 更新時(shí)間:2019年04月07日 15:26:08   作者:Hcl  
這篇文章主要給大家介紹了關(guān)于JavaScript數(shù)組去重的幾種方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用JavaScript具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

前言

有時(shí)候我們做項(xiàng)目的時(shí)候往往會(huì)需要把數(shù)組里面一些重復(fù)的項(xiàng)去掉,但是原生JS有排序,有篩選等等,但是就是沒(méi)有數(shù)組去重怎么辦呢?

這能怎么辦,自己手動(dòng)實(shí)現(xiàn)嘛。

數(shù)組不像對(duì)象和hash有唯一的標(biāo)志特征(key)。所以,數(shù)組去重的核心就是【1】數(shù)組內(nèi)元素互相比較,然后放入新的數(shù)組中。【2】參照對(duì)象構(gòu)建一個(gè)唯一的特征標(biāo)志,然后放入新數(shù)組中。以下就是依照這種思路產(chǎn)生的方法?!?】數(shù)組中含對(duì)象的去重方式我采用使用JSON.stringify()將對(duì)象轉(zhuǎn)換成JSON字符串進(jìn)行比較的方式。

1.最基礎(chǔ)的去重:雙重遍歷

雙重遍歷的核心就是依據(jù)【1】,通過(guò)拿出一個(gè)元素和剩下的元素依次比較,如果全部不相等則證明此元素為唯一。

let a=[{a:1},{b:2},{c:3},{a:1},{d:2}]
let c=[1,2,3,4,5,6,1,2,3]
function unique(arr){
 let b=[]
 for(let i=0;i<arr.length;i++){
 let unexit=true
 for(let j=i+1;j<arr.length;j++){
  if(JSON.stringify(arr[i])===JSON.stringify(arr[j])){
  unexit=false
  break
  }
  else{
  unexit=true
  }
 }
 if(unexit){
  b.push(arr[i])
 }
 }
 return b
}

關(guān)于數(shù)組中存在對(duì)象,是采用JSON.stringify()轉(zhuǎn)換成JSON字符串進(jìn)行的比較,后續(xù)不再敘述。雙重遍歷的缺點(diǎn)是復(fù)雜度太高。
上面的代碼去重得到的結(jié)果的順序會(huì)改變,所以如果想要順序按照原有順序,數(shù)組在進(jìn)行去重時(shí)建議重新申明一個(gè)新的數(shù)組(var new=old.reverse() )得到一個(gè)新的相反的數(shù)組,最后再使用reverse()。之所以新建數(shù)組而不是直接取反是因?yàn)椋?code>reverse()會(huì)修改原數(shù)組。

2.Array.prototype.sort():相鄰元素去重

相鄰元素去重的核心在于Array.sort()能夠?qū)?shù)組進(jìn)行排序。這樣相等的數(shù)組就會(huì)在相鄰的位置,通過(guò)比較相鄰的元素就可以起到去重的作用【1】。

let c=[1,2,3,4,5,6,1,2,3]
function unique(arr){
 let Arr=arr.sort()
 let b=[]
 for(let i=0;i<Arr.length;i++){
 if(Arr[i]!==Arr[i+1]){
  b.push(Arr[i])
 }
 }
 return b
}

Array.prototype.sort()方法可以使用array.sort((a,b)=>{a.key-b.ky})進(jìn)行對(duì)象的排序,前提是數(shù)組中的對(duì)象存在相同的key值。

3.Object.keys():存在唯一性

在一個(gè)對(duì)象里面key值是唯一的,所以通過(guò)遍歷數(shù)組給每個(gè)數(shù)組一個(gè)標(biāo)志,通過(guò)標(biāo)志去重【2】

let a=[{a:1},{b:2},{c:3},{a:1},{d:2}]
let c=[1,2,3,4,5,6,1,2,3]
function unique(arr){
 let b=[]
 let hash={}
 for(let i=0;i<arr.length;i++){
 if(!hash[JSON.stringify(arr[i])]){
  hash[JSON.stringify(arr[i])]=true
  b.push(arr[i])
 }
 }
 return b
}

4.雙重遍歷去重改良之:indexOf

雙重遍歷的思路我們都知道,先拿出一個(gè)元素,然后使用循環(huán)再次遍歷數(shù)組去一一比較。如果有一個(gè)方式能夠讓我們不再遍歷一遍數(shù)組,那么復(fù)雜度相對(duì)而言會(huì)減少一點(diǎn)。

indexOf 方法返回給定元素在數(shù)組中第一次出現(xiàn)的位置,如果沒(méi)有出現(xiàn)則返回-1。首先我們新建一個(gè)空數(shù)組(arry),如果:arry.indexOf(數(shù)組元素)===-1,那么我們就可以知道arry中不存在元素。

let c=[1,2,3,4,5,6,1,2,3]
function unique(arr){
 let b=[]
 for(let i=0;i<arr.length;i++){
 if(b.indexOf(arr[i])==-1){
  b.push(arr[i])
 }
 }
 return b
}

indexOf 方法可返回某個(gè)指定的字符串值在字符串中首次出現(xiàn)的位置。所以對(duì)象不適用,因?yàn)閷?duì)象轉(zhuǎn)為字符串就都會(huì)變成{object,object} ,無(wú)法比較。

5.循環(huán)遍歷之:map()/forEach()

map()和forEach()都可以實(shí)現(xiàn)遍歷數(shù)組。所以以上的方法都可以用map()、forEach()改寫(xiě)。下面我只簡(jiǎn)單的改寫(xiě)一個(gè),其他的改寫(xiě)方式參照即可。

let c=[1,2,3,4,5,6,1,2,3]
function unique(arr){
 let b=[]
 arr.forEach(res=>{
 if(b.indexOf(res)==-1){
  b.push(res)
 }
 })
 return b
}

6.ES6:Set數(shù)據(jù)結(jié)構(gòu)

Set數(shù)據(jù)類(lèi)似于數(shù)組,但是成員的值都是唯一的,沒(méi)有重復(fù)的值。它可以接收一個(gè)數(shù)組,類(lèi)于:let a=[1,2,3,1,2]  Set(a)=>1,2,3 所以可以使用Set()實(shí)現(xiàn)去重。

let c=[1,2,3,4,5,6,1,2,3]
function unique(arr){
 let b=new Set(arr)
 let c=Array.from(b)
 return c
}

Set去重不適用于含對(duì)象的數(shù)組,因?yàn)镾et的去重參照的是(===),數(shù)組中的元素對(duì)象,雖然可能數(shù)值相等,但是地址不相等。所以Set無(wú)法實(shí)現(xiàn)去重。

7.總結(jié)

實(shí)現(xiàn)數(shù)組的去重,要么通過(guò)元素對(duì)比,要么設(shè)置特殊標(biāo)志識(shí)別。元素對(duì)比的思路有2種:一種是和原數(shù)組一一對(duì)比;另一種和新的數(shù)組對(duì)比。

如果要實(shí)現(xiàn)含對(duì)象的數(shù)組去重,一般使用遍歷的方式,包括使用遍歷類(lèi)的方法(map、forEach、reduce等)。像Set、sort等通過(guò)改變數(shù)組的方式一般是不可行的。

好了,以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。

相關(guān)文章

  • javascript中Number對(duì)象的toString()方法分析

    javascript中Number對(duì)象的toString()方法分析

    這篇文章主要介紹了javascript中Number對(duì)象的toString()方法,較為詳細(xì)的分析了toString()方法的用法及注意事項(xiàng),非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2014-12-12
  • JavaScript圖片懶加載的優(yōu)化方法詳解

    JavaScript圖片懶加載的優(yōu)化方法詳解

    這篇文章主要為大家詳細(xì)介紹了JavaScript圖片懶加載的優(yōu)化方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-03-03
  • 微信小程序scroll-view指定滾動(dòng)元素起始位置怎么做

    微信小程序scroll-view指定滾動(dòng)元素起始位置怎么做

    scroll-view為滾動(dòng)視圖,分為水平滾動(dòng)和垂直滾動(dòng),這篇文章主要給大家介紹了關(guān)于微信小程序scroll-view不能左右滑動(dòng)問(wèn)題的解決方法,需要的朋友可以參考下
    2022-12-12
  • JavaScript this的原理以及指向詳解

    JavaScript this的原理以及指向詳解

    面向?qū)ο笳Z(yǔ)言中 this 表示當(dāng)前對(duì)象的一個(gè)引用。但在 JavaScript 中 this 不是固定不變的,它會(huì)隨著執(zhí)行環(huán)境的改變而改變,在方法中,this 表示該方法所屬的對(duì)象,如果單獨(dú)使用,this 表示全局對(duì)象
    2021-10-10
  • 微信小程序使用navigator實(shí)現(xiàn)頁(yè)面跳轉(zhuǎn)功能

    微信小程序使用navigator實(shí)現(xiàn)頁(yè)面跳轉(zhuǎn)功能

    本周學(xué)習(xí)了navigtor到導(dǎo)航組件,目前我想使用navigtor組件實(shí)現(xiàn)跳轉(zhuǎn)以及返回功能,下面這篇文章主要給大家介紹了關(guān)于微信小程序使用navigator實(shí)現(xiàn)頁(yè)面跳轉(zhuǎn)功能的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-08-08
  • 微信小程序基于ColorUI構(gòu)建皮皮蝦短視頻去水印組件

    微信小程序基于ColorUI構(gòu)建皮皮蝦短視頻去水印組件

    這篇文章主要介紹了微信小程序-基于ColorUI構(gòu)建皮皮蝦短視頻去水印組件,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2020-11-11
  • 8 行 Node.js 代碼實(shí)現(xiàn)代理服務(wù)器

    8 行 Node.js 代碼實(shí)現(xiàn)代理服務(wù)器

    JavaScript 前后端通吃,在全棧開(kāi)發(fā)領(lǐng)域具有獨(dú)特的優(yōu)勢(shì)。今天就來(lái)看看作為服務(wù)端語(yǔ)言的 JavaScript,完成一個(gè)簡(jiǎn)單的代理服務(wù)器功能是多么容易。
    2016-12-12
  • ECharts事件處理與旭日?qǐng)D實(shí)現(xiàn)

    ECharts事件處理與旭日?qǐng)D實(shí)現(xiàn)

    這篇文章介紹了ECharts事件處理與實(shí)現(xiàn)旭日?qǐng)D的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-06-06
  • 分析javascript原型及原型鏈

    分析javascript原型及原型鏈

    本篇文章給大家詳細(xì)分析了javascript原型及原型鏈的相關(guān)知識(shí)點(diǎn)以及用法分享,有興趣的朋友參考下。
    2018-03-03
  • JS字符串去除連續(xù)或全部重復(fù)字符的實(shí)例

    JS字符串去除連續(xù)或全部重復(fù)字符的實(shí)例

    這篇文章主要介紹了JS字符串去除連續(xù)或全部重復(fù)字符的實(shí)例,需要的朋友可以參考下
    2018-03-03

最新評(píng)論

宁化县| 渑池县| 辽源市| 三亚市| 榆林市| 清丰县| 桐梓县| 曲水县| 甘德县| 多伦县| 浙江省| 明星| 阜平县| 资阳市| 肇庆市| 连山| 北辰区| 定边县| 射阳县| 六枝特区| 长兴县| 昌黎县| 蒲城县| 慈溪市| 增城市| 苗栗县| 涟源市| 枣阳市| 深水埗区| 澄迈县| 仁化县| 湟源县| 凤城市| 班戈县| 西乡县| 南郑县| 会宁县| 沙雅县| 龙泉市| 鞍山市| 朔州市|