摘要:原文地址方法一普通方法方法二實(shí)質(zhì)上是方法一的變通版本創(chuàng)建一個(gè)目的數(shù)組,并把源數(shù)組的第一項(xiàng)添加到目的數(shù)組的第一項(xiàng)上面的方法可以簡(jiǎn)單處理或者或者方法三方法以空間換時(shí)間速度最快或者可以這樣說(shuō)明對(duì)象中已經(jīng)存在這一項(xiàng)了,也就是說(shuō)在數(shù)組中重復(fù)了
原文地址
方法一 普通方法function unique1(srcArr) { let dstArr = [] for (let i = 0; i < srcArr.length - 1; i++) { if (dstArr.indexOf(srcArr[i]) == -1) dstArr.push(srcArr[i]) } return dstArr; }方法二 實(shí)質(zhì)上是方法一的變通版本
function unique2(srcArr) { // 創(chuàng)建一個(gè)目的數(shù)組,并把源數(shù)組的第一項(xiàng)添加到目的數(shù)組的第一項(xiàng) let destArr = [srcArr[0]] for(let i = 1; i < srcArr.length - 1; i++) { if(srcArr.indexOf(srcArr[i]) == i) destArr.push(srcArr[i]); } return destArr; }
// 上面的方法可以簡(jiǎn)單處理
function unique3(srcArr) { return srcArr.filter((v, i) => srcArr.indexOf(v) === i) } // 或者 function unique4(srcArr) { return srcArr.form(new Set(srcArr)) } // 或者 function unique5(srcArr) { return [...new Set(this)]; }方法三 hash方法 以空間換時(shí)間, 速度最快
function unique6(srcArr) { let tempMap = {}, dstArr = []; for(let i = 0; i < srcArr.length - 1; i++) { if(!tempMap[srcArr[i]]) { destArr.push(srcArr[i]); tempMap[srcArr] = true; } } return destArr }
// 或者 可以這樣
function unique7(srcArr) { var obj = {}; for(var i = 0 ; i < srcArr.length; i++){ var cur = srcArr[i]; if(obj[cur] == cur){//說(shuō)明對(duì)象中已經(jīng)存在cur這一項(xiàng)了,也就是說(shuō)在數(shù)組中重復(fù)了,刪除就可以了 // arr.splice(i,1); //用這個(gè)存在問(wèn)題:后面每一項(xiàng)索引都改變,如果有1千萬(wàn)項(xiàng),非常耗性能 // 解決思路,我把數(shù)組末尾那一項(xiàng)的值拿過(guò)來(lái),替換當(dāng)前項(xiàng),再把數(shù)組末尾那一項(xiàng)的值刪除掉就行 srcArr[i] = srcArr[srcArr.length-1]; srcArr.length -- ; i --;//解決了數(shù)組塌陷問(wèn)題 continue; } obj[cur] = cur; } }方法四 排序后相鄰去重
這個(gè)方法也能想到,當(dāng)初面試的時(shí)候想到的就是這個(gè)方法
function unique8(srcArr) { srcArr.sort() let dstArr = [srcArr[0]]; if(srcArr[i] !== destArr[destArr.length - 1]) destArr.push(srcArr[i]); return destArr; }方法五 優(yōu)化遍歷數(shù)組 其實(shí)這個(gè)方法跟第一個(gè)方法沒(méi)什么區(qū)別
function unique9(srcArr) { let dstArr = [] for(let i = 0; i < srcArr.length; i++) { for(let j = i + 1; j < srcArr.length; j++) if (srcArr[i] === srcArr[j]) j = ++i; destArr.push(srcArr[i]); } return destArr; }
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/100320.html
摘要:設(shè)計(jì)模式是以面向?qū)ο缶幊虨榛A(chǔ)的,的面向?qū)ο缶幊毯蛡鹘y(tǒng)的的面向?qū)ο缶幊逃行┎顒e,這讓我一開(kāi)始接觸的時(shí)候感到十分痛苦,但是這只能靠自己慢慢積累慢慢思考。想繼續(xù)了解設(shè)計(jì)模式必須要先搞懂面向?qū)ο缶幊?,否則只會(huì)讓你自己更痛苦。 JavaScript 中的構(gòu)造函數(shù) 學(xué)習(xí)總結(jié)。知識(shí)只有分享才有存在的意義。 是時(shí)候替換你的 for 循環(huán)大法了~ 《小分享》JavaScript中數(shù)組的那些迭代方法~ ...
摘要:排序,數(shù)組去重,打亂數(shù)組,統(tǒng)計(jì)數(shù)組各個(gè)元素出現(xiàn)的次數(shù),字符串各個(gè)字符的出現(xiàn)次數(shù),獲取地址鏈接的各個(gè)參數(shù)以后會(huì)記錄自己解決過(guò)和遇到過(guò)的算法相關(guān)的題,系列一就以常見(jiàn)的開(kāi)篇吧。 排序,數(shù)組去重,打亂數(shù)組,統(tǒng)計(jì)數(shù)組各個(gè)元素出現(xiàn)的次數(shù), 字符串各個(gè)字符的出現(xiàn)次數(shù),獲取地址鏈接的各個(gè)參數(shù) 以后會(huì)記錄自己解決過(guò)和遇到過(guò)的算法相關(guān)的題,系列一就以常見(jiàn)的開(kāi)篇吧。 排序 本來(lái)想多列幾個(gè)排序方法,但是其它都...
摘要:忍者級(jí)別的函數(shù)操作對(duì)于什么是匿名函數(shù),這里就不做過(guò)多介紹了。我們需要知道的是,對(duì)于而言,匿名函數(shù)是一個(gè)很重要且具有邏輯性的特性。通常,匿名函數(shù)的使用情況是創(chuàng)建一個(gè)供以后使用的函數(shù)。 JS 中的遞歸 遞歸, 遞歸基礎(chǔ), 斐波那契數(shù)列, 使用遞歸方式深拷貝, 自定義事件添加 這一次,徹底弄懂 JavaScript 執(zhí)行機(jī)制 本文的目的就是要保證你徹底弄懂javascript的執(zhí)行機(jī)制,如果...
摘要:參數(shù)用來(lái)測(cè)試數(shù)組的每個(gè)元素的函數(shù)。調(diào)用時(shí)使用參數(shù)。返回表示保留該元素通過(guò)測(cè)試,則不保留。執(zhí)行時(shí)的用于的值。那些沒(méi)有通過(guò)測(cè)試的元素會(huì)被跳過(guò),不會(huì)被包含在新數(shù)組中。有其他好的方法或思路的道友,不妨在沙發(fā)區(qū)神交一番。 需求 給出一個(gè)類(lèi)數(shù)組,刪除要求的重復(fù)數(shù)據(jù),返回新數(shù)組 destroyer([1, 2, 3, 1, 2, 3], 2, 3) should return [1, 1] dest...
距離上次發(fā)文,已經(jīng)有一段時(shí)間了,最近工作比較忙,這不眼看快雙十一了,就相當(dāng)于給大家一些福利吧! showImg(https://segmentfault.com/img/remote/1460000016538082?w=250&h=250); 一、什么是數(shù)組去重 簡(jiǎn)單說(shuō)就是把數(shù)組中重復(fù)的項(xiàng)刪除掉,你 GET 到了嗎 ?下面我將簡(jiǎn)單介紹下幾種基本的方法及其優(yōu)缺點(diǎn)。 二、方法匯總 兩層循環(huán) 無(wú)相同...
閱讀 2847·2021-10-11 11:08
閱讀 1555·2021-09-30 09:48
閱讀 1113·2021-09-22 15:29
閱讀 1097·2019-08-30 15:54
閱讀 1058·2019-08-29 15:19
閱讀 587·2019-08-29 13:12
閱讀 3233·2019-08-26 13:53
閱讀 1035·2019-08-26 13:28