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

JavaScript數(shù)組去重的六種方式

 更新時(shí)間:2024年12月19日 08:28:48   作者:程序員小寒  
在平時(shí)的前端開發(fā)中,常常會(huì)遇到數(shù)組去重的場(chǎng)景,比如表單校驗(yàn)重復(fù)的數(shù)據(jù),有重復(fù)數(shù)據(jù)不讓提交,或者對(duì)后端返回的數(shù)據(jù)進(jìn)行去重展示等,同時(shí)它也是一道經(jīng)典的前端JavaScript基礎(chǔ)面試題,本期一起來(lái)帶大家看看去重的各種花樣方法,需要的朋友可以參考下

一、最樸素的方法去重:雙重for循環(huán)

一想到去重,第一個(gè)就想到了雙重for循環(huán),遍歷兩層比較一下就好了,不過(guò)要注意的是,用數(shù)組的splice刪除重復(fù)項(xiàng)后,需要將第二層循環(huán)的索引減1,不然會(huì)出現(xiàn)數(shù)組塌陷的問(wèn)題

function unique(arr) {
	for (let i = 0; i < arr.length; i++) {
		for (let j = i + 1; j < arr.length; j++) {
			if (arr[i] === arr[j]) {
				arr.splice(j, 1);
				j--; // 注意:由于刪除了元素,需要將 j 減一,以避免漏掉第j項(xiàng)的檢查
			}
		}
	}
	return arr;
}
const arr = [1,1,2,2,3,4,4,5,5,6];
console.log(unique(arr));
// 輸出:[ 1, 2, 3, 4, 5, 6 ]

二、最省時(shí)間的去重:obj/Map存儲(chǔ) + for循環(huán)

由于對(duì)象Objectkey值唯一,所以我們可以利用這個(gè)特性進(jìn)行去重。核心思路就是用對(duì)象或者Map將遍歷過(guò)的項(xiàng)作為key存儲(chǔ)到對(duì)象或者Map中,如果遇到已經(jīng)存在的key,則說(shuō)明出現(xiàn)了重復(fù)項(xiàng),忽略此項(xiàng)即可。

function unique(arr) {
	const obj = {}; // 這里可以換成Map
	const newArr = [];
	for (let i = 0; i < arr.length; i++) {
		const item = arr[i];
		if (!obj[item]) {
			obj[item] = 1;
			newArr.push(item);
		}
	}
	return newArr;
}

這也是典型的空間換時(shí)間大法,可以讓時(shí)間復(fù)雜度從O(n²)降為O(n),利用對(duì)象存儲(chǔ),達(dá)到空間換時(shí)間的效果,節(jié)約執(zhí)行時(shí)間。

三、最好理解的去重:indexOf + lastIndexOf

JavaScript中提供了indexOflastIndexOf兩個(gè)方法,分別拿目標(biāo)項(xiàng)從數(shù)組的第一項(xiàng)最后一項(xiàng)開始查找,查到了會(huì)返回對(duì)應(yīng)的索引值,如果某一項(xiàng)用indexOflastIndexOf找到的索引相同,則證明該項(xiàng)不存在重復(fù)項(xiàng),反之就存在重復(fù)項(xiàng)。

這種去重方式應(yīng)該是最好理解的。不過(guò)要注意,這里也使用了splice,需要注意處理防止數(shù)組塌陷的問(wèn)題。

function unique(arr) {
	for (let i = 0; i < arr.length; i++) {
		if (arr.indexOf(arr[i]) !== arr.lastIndexOf(arr[i])) {
			arr.splice(i, 1);
			i--; // 注意:由于刪除了元素,需要將 i 減一,以避免漏掉第i項(xiàng)的檢查
		}
	}
	return arr;
}

四、最簡(jiǎn)單的去重:展開運(yùn)算符 + Set

利用ES6的新特性,也就是展開運(yùn)算符 + set應(yīng)該是最簡(jiǎn)單的去重方式,寫的字符數(shù)也是最少的。

function unique(arr) {
  return [...new Set(arr)];
}

五、最有趣的去重:filter + indexOf去重

利用filter + indeOf其實(shí)也可以實(shí)現(xiàn)去重,而且是一行代碼搞定,非常有趣。

核心的思路就是,在用filter遍歷時(shí),用indexOf去查找當(dāng)前遍歷項(xiàng)的索引,如果查找到的索引與此時(shí)filter遍歷的index一樣,那么說(shuō)明在當(dāng)前項(xiàng)之前是沒(méi)出現(xiàn)與當(dāng)前項(xiàng)相同的重復(fù)項(xiàng)的,所以該項(xiàng)需要保留,反之則需要剔除,而正好filter自帶過(guò)濾功能,返回true保留該項(xiàng),返回false剔除該項(xiàng)。

function unique(arr) {
  return arr.filter((item, index) => arr.indexOf(item) === index);
}
const arr = [1,1,2,2,3,4,4,5,5,6];
console.log(unique(arr));
// 輸出:[ 1, 2, 3, 4, 5, 6 ]

六、最騷的去重:JSON.stringify + Set + JSON.parse

想不到吧,利用JSON.stringify + Set + JSON.parse居然也可以實(shí)現(xiàn)去重,這應(yīng)該是最騷的去重方式了,而且天然就支持對(duì)存放數(shù)組的對(duì)象進(jìn)行去重。

去重的核心思路如下:

  • 利用JSON.stringify可以將數(shù)組每一項(xiàng)存儲(chǔ)的對(duì)象或者普通值都進(jìn)行序列化,將原數(shù)組轉(zhuǎn)為一個(gè)字符串?dāng)?shù)組;
  • 利用Set對(duì)字符串?dāng)?shù)組進(jìn)行去重;
  • 利用JSON.parse對(duì)數(shù)組每一項(xiàng)進(jìn)行反序列化。

這里注意,如果兩個(gè)對(duì)象存的key和value都相同,則他們序列化的結(jié)果也相同,所以說(shuō)這種方式是天然支持對(duì)對(duì)象進(jìn)行去重的。

function unique(arr) {
    return [...new Set(arr.map(t => JSON.stringify(t)))].map(s => JSON.parse(s));
}
const arr = [1,1,2,2,3,4,4,5,5,6];
const arr1 = [{ a:1 }, { a:1 }, { a:2 }, { a:2 }, { a:3 }, { a:3 }, { a:4 }, { a:4 }, { a:5 }, { a:5 } ]
console.log(unique(arr));
console.log(unique(arr1));
/**
 * 打印結(jié)果:
 * [ 1, 2, 3, 4, 5, 6 ]
 * [ { a: 1 }, { a: 2 }, { a: 3 }, { a: 4 }, { a: 5 } ]
 */

以上介紹了6種JavaScript去重方式,我平常最常用的就是第四種,也就是展開運(yùn)算符 + Set去重,不知道大家在平時(shí)實(shí)際開發(fā)中更喜歡哪一種去重方式呢,或者還有沒(méi)有其它的更好去重方式呢?

到此這篇關(guān)于JavaScript數(shù)組去重的六種方式的文章就介紹到這了,更多相關(guān)JavaScript數(shù)組去重內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • JavaScript中Promise.try() 的用法小結(jié)

    JavaScript中Promise.try() 的用法小結(jié)

    本文主要介紹了JavaScript中Promise.try() 的用法小結(jié),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2026-03-03
  • JS+Canvas實(shí)現(xiàn)貪吃蛇小游戲

    JS+Canvas實(shí)現(xiàn)貪吃蛇小游戲

    這篇文章介紹了JS+Canvas實(shí)現(xiàn)貪吃蛇小游戲,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-01-01
  • JavaScript仿京東放大鏡特效

    JavaScript仿京東放大鏡特效

    這篇文章主要為大家詳細(xì)介紹了JavaScript仿京東放大鏡特效,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • js計(jì)算兩個(gè)日期間的天數(shù)月的實(shí)例代碼

    js計(jì)算兩個(gè)日期間的天數(shù)月的實(shí)例代碼

    本文通過(guò)實(shí)例代碼給大家介紹了基于js計(jì)算兩個(gè)日期間的天數(shù)月,文中還通過(guò)一段代碼給大家簡(jiǎn)單說(shuō)明了js計(jì)算兩個(gè)日期差的方法,感興趣的朋友跟隨小編一起看看吧
    2018-09-09
  • JavaScript事件學(xué)習(xí)小結(jié)(三)js事件對(duì)象

    JavaScript事件學(xué)習(xí)小結(jié)(三)js事件對(duì)象

    這篇文章主要介紹了JavaScript事件學(xué)習(xí)小結(jié)(三)js事件對(duì)象的相關(guān)資料,非常不錯(cuò)具有參考借鑒價(jià)值,需要的朋友可以參考下
    2016-06-06
  • 給頁(yè)面渲染時(shí)間加速 干掉Dom Level 0 Event

    給頁(yè)面渲染時(shí)間加速 干掉Dom Level 0 Event

    我們?nèi)サ羰录壎ǖ倪壿?發(fā)現(xiàn)只渲染dom元素,不綁定事件的時(shí)間,僅僅125ms,可見(jiàn)事件綁定的時(shí)間消耗還是很大的 ,尤其是第一種方式,也就是Dom Level 0 Event,最為耗時(shí)
    2012-12-12
  • javascript實(shí)現(xiàn)的動(dòng)態(tài)文字變換

    javascript實(shí)現(xiàn)的動(dòng)態(tài)文字變換

    javascript實(shí)現(xiàn)的動(dòng)態(tài)文字變換...
    2007-07-07
  • 通過(guò)遮罩層實(shí)現(xiàn)浮層DIV登錄的js代碼

    通過(guò)遮罩層實(shí)現(xiàn)浮層DIV登錄的js代碼

    遮罩層實(shí)現(xiàn)浮層DIV登錄的效果,想必很多的朋友都有遇到過(guò)吧,實(shí)現(xiàn)起來(lái)也是很簡(jiǎn)單的,下面有個(gè)不錯(cuò)的實(shí)現(xiàn),大家可以感受下
    2014-02-02
  • 詳解如何構(gòu)建Promise隊(duì)列實(shí)現(xiàn)異步函數(shù)順序執(zhí)行

    詳解如何構(gòu)建Promise隊(duì)列實(shí)現(xiàn)異步函數(shù)順序執(zhí)行

    這篇文章主要介紹了詳解如何構(gòu)建Promise隊(duì)列實(shí)現(xiàn)異步函數(shù)順序執(zhí)行,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-10-10
  • 一個(gè)簡(jiǎn)單的js漸顯(fadeIn)漸隱(fadeOut)類

    一個(gè)簡(jiǎn)單的js漸顯(fadeIn)漸隱(fadeOut)類

    最近發(fā)現(xiàn)項(xiàng)目用的表單驗(yàn)證不好使,干脆一邊參考人家的一邊自己寫了一個(gè)。在驗(yàn)證有錯(cuò)誤返回提示信息用到漸顯(fadeIn)漸隱(fadeOut)過(guò)渡(因?yàn)闉g覽器的效率實(shí)在太高了,一下就蹦了出來(lái)~~);
    2010-06-06

最新評(píng)論

铁力市| 呼图壁县| 天祝| 汤原县| 鄂尔多斯市| 怀远县| 岑溪市| 临江市| 密山市| 调兵山市| 车险| 榆社县| 岗巴县| 孙吴县| 榕江县| 修武县| 綦江县| 仲巴县| 西和县| 盐源县| 阿城市| 汽车| 香河县| 曲靖市| 湄潭县| 南宁市| 中阳县| 大理市| 保靖县| 潮安县| 克什克腾旗| 迭部县| 石阡县| 涿鹿县| 梓潼县| 永修县| 海盐县| 滨州市| 东乌珠穆沁旗| 桦南县| 灵丘县|