成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

為什么前端開發(fā)者都用 Set 代替 Array 去重?實(shí)測性能對比

開發(fā)
隨著ES6的普及,越來越多的前端開發(fā)者拋棄了傳統(tǒng)的Array去重方法,轉(zhuǎn)而使用Set來完成這項(xiàng)任務(wù)。這種轉(zhuǎn)變不僅僅是因?yàn)榇a更簡潔,更重要的是性能上的巨大差異。

數(shù)組去重是JavaScript中的一個常見的操作,隨著ES6的普及,越來越多的前端開發(fā)者拋棄了傳統(tǒng)的Array去重方法,轉(zhuǎn)而使用Set來完成這項(xiàng)任務(wù)。這種轉(zhuǎn)變不僅僅是因?yàn)榇a更簡潔,更重要的是性能上的巨大差異。

一、Set去重的簡潔寫法

在ES6出現(xiàn)之前,數(shù)組去重通常需要編寫循環(huán)和條件判斷:

function uniqueArray(arr) {
const result = [];
for (let i = 0; i < arr.length; i++) {
    if (result.indexOf(arr[i]) === -1) {
      result.push(arr[i]);
    }
  }
return result;
}

// 使用
const array = [1, 2, 3, 3, 4, 4, 5];
const unique = uniqueArray(array); // [1, 2, 3, 4, 5]

而使用Set,代碼可以簡化為:

但代碼簡潔只是表面優(yōu)勢,真正的價值在于性能提升。

二、性能對比:數(shù)字以為自己聽錯了

讓我們通過幾種常見的去重方法進(jìn)行性能對比:

  • Set方法
  • 傳統(tǒng)的indexOf方法
  • 使用對象(Object)作為哈希表
  • 使用Array.includes方法
  • 使用filter + indexOf

三、測試方法

我們將創(chuàng)建不同大小的數(shù)組進(jìn)行測試,每個數(shù)組包含隨機(jī)生成的數(shù)字,并確保約有30%的元素是重復(fù)的:

四、測試結(jié)果

以下是在不同大小數(shù)組上各方法的執(zhí)行時間(單位:毫秒):

方法

100元素

10,000元素

1,000,000元素

Set

0.05

1.2

85

Object哈希表

0.08

2.8

120

indexOf

0.2

350

超過30秒

includes

0.2

380

超過30秒

filter+indexOf

0.3

800

超過60秒

在百萬級數(shù)據(jù)上,Set比傳統(tǒng)indexOf方法快了約300倍以上。

五、為什么Set如此高效?

Set之所以能提供如此驚人的性能優(yōu)勢,主要有以下幾個原因:

1. 數(shù)據(jù)結(jié)構(gòu)的本質(zhì)區(qū)別

Set是基于哈希表實(shí)現(xiàn)的,這意味著:

  • 查找、添加和刪除操作的時間復(fù)雜度為O(1)
  • 每個值在底層都有唯一的"地址",可以直接訪問

而Array的indexOf和includes方法需要線性搜索,時間復(fù)雜度為O(n)。

2. 引擎優(yōu)化

JavaScript引擎對Set進(jìn)行了特殊優(yōu)化:

  • V8引擎中,Set使用哈希表和紅黑樹的組合實(shí)現(xiàn)
  • Set在內(nèi)存中的布局更適合現(xiàn)代CPU的緩存機(jī)制
  • 引擎可以對Set操作應(yīng)用更多底層優(yōu)化

3. 自動處理邊緣情況

Set能正確處理JavaScript中的特殊值:

注意Set正確地將NaN與NaN視為相同(盡管NaN !== NaN),并且區(qū)分了0和"0"。

六、什么時候不應(yīng)該使用Set?

盡管Set有許多優(yōu)勢,但也不是所有場景都適合:

  • 需要保持原始順序:雖然現(xiàn)代瀏覽器中Set是有序的(按插入順序),但這并不是規(guī)范保證的
  • 需要索引訪問:Set不支持索引訪問(如set[0])
  • 需要頻繁修改:如果需要頻繁修改集合中的元素,數(shù)組的API可能更方便
  • 處理非原始類型:對于對象等非原始類型,Set使用引用相等,可能不符合預(yù)期

七、最佳實(shí)踐:Set和Array結(jié)合使用

現(xiàn)代前端開發(fā)中,一個常見的模式是Set和Array結(jié)合使用:

// 數(shù)據(jù)處理流程
constprocessData = (dataArray) => {
// 1. 去重
const uniqueData = [...newSet(dataArray)];

// 2. 使用數(shù)組方法進(jìn)行處理
return uniqueData
    .filter(item => item > 10)
    .map(item => item * 2)
    .sort((a, b) => a - b);
};

這種模式結(jié)合了Set的高效去重能力和Array豐富的數(shù)據(jù)處理方法。

責(zé)任編輯:趙寧寧 來源: JavaScript
相關(guān)推薦

2020-11-08 14:43:25

Python列表去重編程

2025-03-25 07:10:00

開發(fā)前端JavaScript

2023-09-07 13:32:00

MySQL數(shù)據(jù)庫

2014-07-07 09:44:05

前端前端渲染

2025-02-12 12:00:00

前端try-catchJavaScrip

2025-04-08 07:30:00

前端開發(fā)JavaScript

2013-03-28 19:25:35

騰訊云

2025-02-27 07:47:09

Java開發(fā)CAS

2013-04-25 10:14:39

Facebook開發(fā)者開發(fā)

2015-07-29 09:53:57

前端開發(fā)總結(jié)

2024-11-29 07:32:38

2024-10-06 13:00:05

2024-10-06 13:47:43

后端開發(fā)者項(xiàng)目

2017-01-16 13:15:19

前端開發(fā)者清單

2024-01-05 08:46:50

ReactVue

2014-09-17 10:16:41

Java 9

2012-07-13 13:51:57

AndroidiOS

2023-09-20 15:02:56

Java編程語言

2014-12-04 09:58:59

PHP

2013-08-05 13:26:05

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 亚洲精品美女视频 | 国产精品一区二区av | 亚洲一区二区三区在线视频 | 久久99精品久久久久久 | 成人精品鲁一区一区二区 | 色视频在线播放 | 成人影院在线观看 | 欧美久久久久久 | 精品一区二区电影 | 精品一区二区三区在线观看国产 | 97伦理影院| 精品一区二区三区91 | 中文字幕精品一区 | 狠狠干狠狠操 | 1000部精品久久久久久久久 | 日韩久久久久久 | 97精品久久 | 日韩欧美精品在线 | 日本精品在线一区 | 成人夜晚看av | 免费看啪啪网站 | 日本在线免费看最新的电影 | www.性色 | 国产成人精品一区二区 | 国产99在线 | 欧美 | 色婷婷亚洲 | 夜夜艹| 夜夜爽99久久国产综合精品女不卡 | 免费黄色在线 | 久草资源在线视频 | 毛片视频免费 | 久草在线高清 | 精品视频在线免费观看 | 天天干夜夜操 | 三级黄色片在线观看 | 久久久久久免费免费 | 福利精品在线观看 | 亚洲精品久久久一区二区三区 | 国产在线精品一区二区三区 | 国产一级在线 | 香蕉91 |