摘要:數(shù)組去重的幾種方法遍歷數(shù)組法這是最簡單的數(shù)組去重方法,實(shí)現(xiàn)思路新建一新數(shù)組,傳入要去重的數(shù)組,遍歷該數(shù)組,若值不在新數(shù)組中則加入該數(shù)組需要注意點(diǎn)判斷值是否在數(shù)組的方法是方法,以下不支持,示例如下對(duì)象鍵值對(duì)法思路新建一對(duì)象以及數(shù)組,遍歷傳入
數(shù)組去重的幾種方法
1.遍歷數(shù)組法
這是最簡單的數(shù)組去重方法,實(shí)現(xiàn)思路:新建一新數(shù)組,傳入要去重的數(shù)組,遍歷該數(shù)組,若值不在新數(shù)組中則加入該數(shù)組;需要注意點(diǎn):判斷值是否在數(shù)組的方法“indexOf”是ECMAScript5 方法,IE8以下不支持,示例如下:
function removeDup(arr) { let new_arr = []; arr.forEach((val) => { if(new_arr.indexOf(val) === -1){ new_arr.push(val); } }); return new_arr; }
2.對(duì)象鍵值對(duì)法
思路:新建一對(duì)象以及數(shù)組,遍歷傳入的數(shù)組,判斷值是否為js對(duì)象的鍵,若不是則新增鍵值,并放入數(shù)組中;需要注意的地方:判斷是否為js對(duì)象鍵時(shí),會(huì)自動(dòng)對(duì)傳入的鍵toString();
function removeDup2(arr) { let obj = {}, new_arr = [], val, type; for(let i = 0, len = arr.length; i < len; i+=1) { val = arr[i]; type = typeof val; if(!obj[val]) { obj[val] = [type]; new_arr.push(val); }else if(obj[val].indexOf(type) === -1) { obj[val].push(type); new_arr.push(val); } } return new_arr; }
缺點(diǎn):無法真正區(qū)分兩個(gè)對(duì)象,如:`{a:1}`和`{a: 2}`,因?yàn)閠ypeof結(jié)果都是`"object"`,可用`JSON.stringify()`來解決; es6優(yōu)化后如下
function unique(array) { let obj = {}; let type; return array.filter((item, index, array) => { type = typeof item + JSON.stringify(item); return obj.hasOwnProperty(type) ? false : (obj[type] = item); } ) } // 可去除undefined, NaN, Object重復(fù)項(xiàng)
3.排序后相鄰去除法
思路:首先將要去重的數(shù)組使用sort方法排序后,相同的值就會(huì)排在一起,然后就可以只判斷當(dāng)前元素與上一個(gè)元素是否相同,若不同則添加進(jìn)去;
function unique(array) { let res = []; let sortedArray = array.slice(0).sort();//先排序 let seen;//記錄上一個(gè)元素 for(let i = 0, len = sortedArray.length; i < len; i++) { let current = sortedArray[i]; if(!i || seen !== current) { res.push(current); } seen = current; } return res; }
優(yōu)化:可傳入一個(gè)isSorted參數(shù),表明該數(shù)組是否已排序,如果為true,那么就判斷相鄰元素是否相同;如果為false,則使用indexOf判斷:
function unique(array, isSorted) { let res = []; let seen;//記錄上一個(gè)元素 for(let i = 0, len = array.length; i < len; i++) { let current = array[i]; if(isSorted) { if(!i || seen !== current) { res.push(current); } seen = current; }else if(res.indexOf(current) === -1) { res.push(current); } } return res; }
再優(yōu)化:想象一個(gè)場(chǎng)景,你需要對(duì)數(shù)組的每一項(xiàng)進(jìn)行一些處理,但又不想再遍歷一次,那么可添加第三個(gè)參數(shù)itreatee,接受一個(gè)函數(shù)作為處理函數(shù);
function unique(array, isSorted, iteratee) { let res = []; let seen = []; for(let i = 0, len = array.length; i < len; i++) { let value = array[i]; let computed = iteratee ? iteratee(value, i, array) : value; if(isSorted) { if(!i || seen !== computed) { res.push(value); } seen = computed; }else if(iteratee) { if(seen.indexOf(computed) === -1) { res.push(value); seen.push(computed); } }else if(res.indexOf(value) === -1) { res.push(value); } } return res; }
4.ES6,Set和Map去重
function unique(array) { return Array.from(new Set(array)); } //擴(kuò)展運(yùn)算符簡化 let unique = (arr) => [...new Set(arr)]; //使用Map function unique(array) { let seen = new Map(); return arr.filter((a) => !seen.has(a) && seen.set(a, 1)); }
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/97961.html
摘要:將元素作為對(duì)象的鍵,默認(rèn)鍵對(duì)應(yīng)的值為如果對(duì)象中沒有這個(gè)鍵,則將這個(gè)元素放入結(jié)果數(shù)組中去。 前言 數(shù)組去重在日常開發(fā)中的使用頻率還是較高的,也是網(wǎng)上隨便一抓一大把的話題,所以,我寫這篇文章目的在于歸納和總結(jié),既然很多人都在提的數(shù)組去重,自己到底了解多少呢。又或者是如果自己在開發(fā)中遇到了去重的需求,自己能想到更好的解決方案嗎。 這次我們來理一理怎么做數(shù)組去重才能做得最合適,既要考慮兼容性,...
摘要:專題系列第三篇,講解各種數(shù)組去重方法,并且跟著寫一個(gè)前言數(shù)組去重方法老生常談,既然是常談,我也來談?wù)劇K愃朴跀?shù)組,但是成員的值都是唯一的,沒有重復(fù)的值。 JavaScript 專題系列第三篇,講解各種數(shù)組去重方法,并且跟著 underscore 寫一個(gè) unique API 前言 數(shù)組去重方法老生常談,既然是常談,我也來談?wù)劇?雙層循環(huán) 也許我們首先想到的是使用 indexOf 來循...
摘要:數(shù)組去重,一般都是在面試的時(shí)候才會(huì)碰到,一般是要求手寫數(shù)組去重方法的代碼。如果是被提問到,數(shù)組去重的方法有哪些你能答出其中的種,面試官很有可能對(duì)你刮目相看。數(shù)組去重的方法一利用去重中最常用不考慮兼容性,這種去重的方法代碼最少。 數(shù)組去重,一般都是在面試的時(shí)候才會(huì)碰到,一般是要求手寫數(shù)組去重方法的代碼。如果是被提問到,數(shù)組去重的方法有哪些?你能答出其中的10種,面試官很有可能對(duì)你刮目相看...
摘要:而數(shù)組元素去重是基于運(yùn)算符的。而如果有迭代函數(shù),則計(jì)算傳入迭代函數(shù)后的值,對(duì)值去重,調(diào)用方法,而該方法的核心就是調(diào)用方法,和我們上面說的方法一異曲同工。 Why underscore (覺得這部分眼熟的可以直接跳到下一段了...) 最近開始看 underscore.js 源碼,并將 underscore.js 源碼解讀 放在了我的 2016 計(jì)劃中。 閱讀一些著名框架類庫的源碼,就好像...
摘要:數(shù)組去重雙層循環(huán)使用雙層嵌套循環(huán)是最原始的方法用來存儲(chǔ)結(jié)果如果是唯一的,那么執(zhí)行完循環(huán),等于外層循環(huán)內(nèi)層循環(huán)當(dāng)和相等時(shí),跳出循環(huán)。否則說明元素唯一,這時(shí)成立,將此元素添加到中。它類似于數(shù)組,但是成員的值都是唯一的,沒有重復(fù)的值。 JavaScript數(shù)組去重 雙層循環(huán) 使用雙層嵌套循環(huán)是最原始的方法: var array = [a,b,a]; function unique(arra...
摘要:現(xiàn)在要求去重下面這個(gè)數(shù)組測(cè)試重復(fù)重復(fù)方法一測(cè)試重復(fù)重復(fù)去重后測(cè)試重復(fù)是新加的集合集合中的值不會(huì)重復(fù)。歡迎大家一起討論提出新的去重方法。有任何錯(cuò)誤請(qǐng)?jiān)谠u(píng)論指出。 現(xiàn)在要求去重下面這個(gè)數(shù)組 [1, 2, 3, 3, 3, 0, 1, 2, 測(cè)試, 重復(fù), 重復(fù), NaN, NaN, false, false]; 方法一:ES6 Set() let arr = [1, 2, 3, 3, 3,...
閱讀 1085·2021-11-19 09:40
閱讀 2225·2021-11-15 18:00
閱讀 1274·2021-10-18 13:34
閱讀 2255·2021-09-02 15:40
閱讀 1542·2019-08-30 14:01
閱讀 1120·2019-08-30 11:11
閱讀 2487·2019-08-29 15:26
閱讀 734·2019-08-29 14:15