摘要:利用的集合利用集合成員具有唯一值的特性,再借助將類數(shù)組轉(zhuǎn)為真正的數(shù)組我們可以很簡單的完成數(shù)組去重任務(wù)和的配合返回數(shù)組中某個指定的元素第一次出現(xiàn)的位置索引。
①利用ES6的Set集合
利用ES6 Set集合成員具有唯一值的特性,再借助Array.from將類數(shù)組轉(zhuǎn)為真正的數(shù)組
我們可以很簡單的完成數(shù)組去重任務(wù)
let res = Array.from(new Set(arr)); let res = [... new Set(arr)];②indexOf和filter的配合
indexOf():
返回數(shù)組中某個指定的元素第一次出現(xiàn)的位置(索引)。如果在數(shù)組中沒找到指定元素則返回 -1。
filter():
返回指定數(shù)組中符合條件的所有元素
關(guān)鍵語句:
index === array.indexOf(ele)
我們利用indexOf得到的下標(biāo)與當(dāng)前元素的下標(biāo)來判斷這個元素是否是第一次出現(xiàn),然后在利用filter的過濾特性即可。
這里需要注意的判斷NaN,因為 NaN !== NaN,所以indexOf(NaN)始終返回-1,所以我們需要額外去判斷
Array.prototype.uniq = function(){ let flag = true; // 定義標(biāo)記用來判斷NaN return this.filter((ele, index, array) => { if(flag && ele!==ele){ flag = false; return true; } return index===array.indexOf(ele) }) }③利用對象的鍵
核心:利用對象的鍵來存儲我們的元素
如果沒有對象中沒有這個鍵,則進(jìn)行存儲,并設(shè)置這個鍵對應(yīng)值為true,表明已經(jīng)存在該元素
Array.prototype.uniq = function(){ let hash = {}; let data = []; this.forEach(ele => { if (!hash[ele]) { hash[ele] = true; data.push(ele); } }) return data; }
注意:由于普通對象的鍵都是字符串,所以對于像 Number(1)和String(1)則視為它們是同一值,無法正確判斷,對于引用類型的數(shù)據(jù)也是如此( 如 {} 和 {} 視為同一值)
解決辦法:在ES6中提供了Map集合,Map的鍵不再局限于字符串,而是任意類型,可以說是一個完整的hash結(jié)構(gòu),利用Map替換普通對象{}則可以解決上面的問題
Array.prototype.uniq = function(){ let map = new Map(); let data = []; this.forEach(ele => { if(!map.get(ele)){ map.set(ele, true); data.push(ele); } }); return data; }④數(shù)組排序,比較相鄰元素
在數(shù)組排序后,相同的數(shù)據(jù)會集中在一起,因此只需要比較相鄰元素是否相等即可,
比較符可以用 嚴(yán)格比較運(yùn)算符(===) 或者 Object.is()
它們不同之處只有兩個:一是+0不等于-0,二是NaN等于自身。
所以對于NaN,如果使用===,則需要額外判斷
根據(jù)如下方案,數(shù)組最后一個元素必然是唯一值,所以在循環(huán)后把末尾的元素添加進(jìn)去
Array.prototype.uniq = function(){ let res = []; let arr = this.sort(); for(let i = 0; i < arr.length-2; i++){ if(!Object.is(arr[i], arr[i+1])){ res.push(arr[i]) } } res.push(arr.pop()); return res; }
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/102029.html
摘要:昨天在微博上看到一篇文章,也寫數(shù)組去重,主要推崇的方法是將利用數(shù)組元素當(dāng)作對象來去重。我在微博轉(zhuǎn)發(fā)了用對象去重不是個好辦法然后作者問什么才是推薦的方法。實例對象實例對象主要指通過構(gòu)造函數(shù)類生成的對象。 本文同時發(fā)布于個人博客https://www.toobug.net/articl... JavaScript的數(shù)組去重是一個老生常談的話題了。隨便搜一搜就能找到非常多不同版本的解法。 昨...
摘要:而數(shù)組元素去重是基于運(yùn)算符的。而如果有迭代函數(shù),則計算傳入迭代函數(shù)后的值,對值去重,調(diào)用方法,而該方法的核心就是調(diào)用方法,和我們上面說的方法一異曲同工。 Why underscore (覺得這部分眼熟的可以直接跳到下一段了...) 最近開始看 underscore.js 源碼,并將 underscore.js 源碼解讀 放在了我的 2016 計劃中。 閱讀一些著名框架類庫的源碼,就好像...
摘要:如有感興趣,請自行查閱相關(guān)文檔,進(jìn)一步的了解前端的性能優(yōu)化單行文本去重單行文本去重可兼容不支持接口的瀏覽器這里應(yīng)該很好明白是在干什么吧需要傳入一個初始空字符串參數(shù),否則你將得到的是一個字符串被拆分后的數(shù)組。 之前偶然看到一篇使用正則實現(xiàn)字符去重及多行去重的文章。感覺寫的有點(diǎn)糙,而且性能也不夠高,對新手的使用和理解都有一點(diǎn)難度。于是忍不住就搞了一個比較可愛的出來。而且不是一般的可愛,因為...
摘要:基本操作數(shù)組去重寫在前面數(shù)組去重經(jīng)常出現(xiàn)在前端招聘的筆試題里,比如有數(shù)組,請用實現(xiàn)去重函數(shù),使得返回作為筆試題,考點(diǎn)有二正確?;窘榻B文章主要是對數(shù)組去重的常用方法進(jìn)行介紹。 js基本操作-數(shù)組去重 寫在前面 JavaScript 數(shù)組去重經(jīng)常出現(xiàn)在前端招聘的筆試題里,比如: 有數(shù)組 var arr = [a, b, c, 1, 0, c, 1, , 1, 0],請用 JavaScr...
摘要:數(shù)組去重的方法第一種方法方法可以將結(jié)構(gòu)轉(zhuǎn)為數(shù)組這就是提供了一種數(shù)據(jù)去重的方法第二種方法運(yùn)用擴(kuò)展運(yùn)算符提供了一種更便捷的去重方法第三種方法這是一種原生的去重方法,借助一個空數(shù)組來實現(xiàn)去重,便于理解底層原理函數(shù)帶有參數(shù)第四種方法同上函數(shù)不帶參 數(shù)組去重的方法 第一種方法 Array.from方法可以將Set結(jié)構(gòu)轉(zhuǎn)為數(shù)組 let items = new Set([1, 2, 3, 4, 5]...
閱讀 2603·2023-04-25 20:50
閱讀 3966·2023-04-25 18:45
閱讀 2233·2021-11-17 17:00
閱讀 3339·2021-10-08 10:05
閱讀 3088·2019-08-30 15:55
閱讀 3507·2019-08-30 15:44
閱讀 2366·2019-08-29 13:51
閱讀 1125·2019-08-29 12:47