記錄--10個超級實用的Set、Map使用技巧

来源:https://www.cnblogs.com/smileZAZ/archive/2023/05/16/17406410.html
-Advertisement-
Play Games

這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 Set是一種類似於數組的數據結構,但是它的值是唯一的,即Set中的每個值只會出現一次。Set對象的實例可以用於存儲任何類型的唯一值,從而使它們非常適用於去重。 Map是一種鍵值對集合,其中每個鍵都是唯一的,可以是任何類型,而值則可以是任何 ...


這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助

Set是一種類似於數組的數據結構,但是它的值是唯一的,即Set中的每個值只會出現一次。Set對象的實例可以用於存儲任何類型的唯一值,從而使它們非常適用於去重。

Map是一種鍵值對集合,其中每個鍵都是唯一的,可以是任何類型,而值則可以是任何類型。Map對象的實例可以用於存儲複雜的對象,並且可以根據鍵進行快速的查找和訪問。

以下是Set和Map的一些常用方法:

Set:

  • new Set(): 創建一個新的Set對象
  • add(value): 向Set對象中添加一個新的值
  • delete(value): 從Set對象中刪除一個值
  • has(value): 檢查Set對象中是否存在指定的值
  • size: 獲取Set對象中的值的數量
  • clear(): 從Set對象中刪除所有值

Map:

  • new Map(): 創建一個新的Map對象
  • set(key, value): 向Map對象中添加一個鍵值對
  • get(key): 根據鍵獲取Map對象中的值
  • delete(key): 從Map對象中刪除一個鍵值對
  • has(key): 檢查Map對象中是否存在指定的鍵
  • size: 獲取Map對象中的鍵值對數量
  • clear(): 從Map對象中刪除所有鍵值對

Set和Map是非常有用的數據結構,它們可以提高程式的性能和可讀性,並且可以簡化代碼的編寫。

Set

去重

使用 Set 可以輕鬆地進行數組去重操作,因為 Set 只能存儲唯一的值。

const arr = [1, 2, 3, 1, 2, 4, 5];
const uniqueArr = [...new Set(arr)];
console.log(uniqueArr); // [1, 2, 3, 4, 5]

數組轉換

可以使用 Set 將數組轉換為不包含重覆元素的 Set 對象,再使用 Array.from() 將其轉換回數組。

const arr = [1, 2, 3, 1, 2, 4, 5];
const set = new Set(arr);
const uniqueArr = Array.from(set);
console.log(uniqueArr); // [1, 2, 3, 4, 5]

優化數據查找

使用 Set 存儲數據時,查找操作的時間複雜度為 O(1),比數組的 O(n) 要快得多,因此可以使用 Set 來優化數據查找的效率。

const dataSet = new Set([1, 2, 3, 4, 5]);

if (dataSet.has(3)) {
  console.log('數據已經存在');
} else {
  console.log('數據不存在');
}

並集、交集、差集

Set數據結構可以用於計算兩個集合的並集、交集和差集。以下是一些使用Set進行集合運算的示例代碼:

const setA = new Set([1, 2, 3]);
const setB = new Set([2, 3, 4]);

// 並集
const union = new Set([...setA, ...setB]);
console.log(union); // Set {1, 2, 3, 4}

// 交集
const intersection = new Set([...setA].filter(x => setB.has(x)));
console.log(intersection); // Set {2, 3}

// 差集
const difference = new Set([...setA].filter(x => !setB.has(x)));
console.log(difference); // Set {1}

模糊搜索

Set 還可以通過正則表達式實現模糊搜索。可以將匹配結果保存到 Set 中,然後使用 Array.from() 方法將 Set 轉換成數組。

const data = ['apple', 'banana', 'pear', 'orange'];

// 搜索以 "a" 開頭的水果
const result = Array.from(new Set(data.filter(item => /^a/i.test(item))));
console.log(result); // ["apple"]

使用 Set 替代數組實現隊列和棧

可以使用 Set 來模擬隊列和棧的數據結構。

// 使用 Set 實現隊列
const queue = new Set();
queue.add(1);
queue.add(2);
queue.add(3);
queue.delete(queue.values().next().value); // 刪除第一個元素
console.log(queue); // Set(2) { 2, 3 }

// 使用 Set 實現棧
const stack = new Set();
stack.add(1);
stack.add(2);
stack.add(3);
stack.delete([...stack][stack.size - 1]); // 刪除最後一個元素
console.log(stack); // Set(2) { 1, 2 }

Map

將 Map 轉換為對象

const map = new Map().set('key1', 'value1').set('key2', 'value2');
const obj = Object.fromEntries(map);

將 Map 轉換為數組

const map = new Map().set('key1', 'value1').set('key2', 'value2');
const array = Array.from(map);

記錄數據的順序

如果你需要記錄添加元素的順序,那麼可以使用Map來解決這個問題。當你需要按照添加順序迭代元素時,可以使用Map來保持元素的順序。

const map = new Map();
map.set('a', 1);
map.set('b', 2);
map.set('c', 3);
map.set('d', 4);

for (const [key, value] of map) {
  console.log(key, value);
}
// Output: a 1, b 2, c 3, d 4

統計數組中元素出現次數

可以使用 Map 統計數組中每個元素出現的次數。

const arr = [1, 2, 3, 1, 2, 4, 5];

const countMap = new Map();
arr.forEach(item => {
  countMap.set(item, (countMap.get(item) || 0) + 1);
});

console.log(countMap.get(1)); // 2
console.log(countMap.get(2)); // 2
console.log(countMap.get(3)); // 1

統計字元出現次數

使用Map數據結構可以方便地統計字元串中每個字元出現的次數。

const str = 'hello world';
const charCountMap = new Map();
for (let char of str) {
  charCountMap.set(char, (charCountMap.get(char) || 0) + 1);
}
console.log(charCountMap); // Map { 'h' => 1, 'e' => 1, 'l' => 3, 'o' => 2, ' ' => 1, 'w' => 1, 'r' => 1, 'd' => 1 }

緩存計算結果

在處理複雜的計算時,可能需要對中間結果進行緩存以提高性能。可以使用Map數據結構緩存計算結果,以避免重覆計算。

const cache = new Map();
function fibonacci(n) {
  if (n === 0 || n === 1) {
    return n;
  }
  if (cache.has(n)) {
    return cache.get(n);
  }
  const result = fibonacci(n - 1) + fibonacci(n - 2);
  cache.set(n, result);
  return result;
}
console.log(fibonacci(10)); // 55

使用 Map 進行數據的分組

const students = [
  { name: "Tom", grade: "A" },
  { name: "Jerry", grade: "B" },
  { name: "Kate", grade: "A" },
  { name: "Mike", grade: "C" },
];

const gradeMap = new Map();
students.forEach((student) => {
  const grade = student.grade;
  if (!gradeMap.has(grade)) {
    gradeMap.set(grade, [student]);
  } else {
    gradeMap.get(grade).push(student);
  }
});

console.log(gradeMap.get("A")); // [{ name: "Tom", grade: "A" }, { name: "Kate", grade: "A" }]

使用 Map 過濾符合條件的對象

在實際開發中,我們常常需要在一個對象數組中查找符合某些條件的對象。此時,我們可以結合使用 Map 和 filter 方法來實現。比如:

const users = [
  { name: 'Alice', age: 22 },
  { name: 'Bob', age: 18 },
  { name: 'Charlie', age: 25 }
];
const userMap = new Map(users.map(user => [user.name, user]));
const result = users.filter(user => userMap.has(user.name) && user.age > 20);
console.log(result); // [{ name: 'Alice', age: 22 }, { name: 'Charlie', age: 25 }]

首先,我們將對象數組轉換為 Map,以便快速查找。然後,我們使用 filter 方法來過濾符合條件的對象。

這裡我們列舉了一些使用SetMap的實用技巧,它們可以大大簡化你的代碼,並使你更有效地處理數據。SetMap是JavaScript中非常有用的數據結構,值得我們在編寫代碼時好好利用。

本文轉載於:

https://juejin.cn/post/7225425984312328252

如果對您有所幫助,歡迎您點個關註,我會定時更新技術文檔,大家一起討論學習,一起進步。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Ubuntu忘記密碼(五個小步驟) 可能用到的操作: | 按鍵/滑鼠操作 | 作用 | | | | | 進入虛擬機屏幕[點擊] | 滑鼠焦點在虛擬機中,接下來的操作都在虛擬機中響應 | | 退出虛擬機屏幕[ctrl+alt] | 將滑鼠焦點從虛擬機中移除,回到主屏幕 | 步驟一:重啟虛擬機,註意在= ...
  • 近日發現PG官方插件列表中新收錄了一款插件 pg_enterprise_views,因為官方已經數年未添新的插件了很是新奇,找了台設備測試過後果斷上了生產,得空分享給大家。 該插件提供了數十張系統表及一個GUI工具,用以監控從操作系統到資料庫方方面面的性能情況,並支持對任意時段歷史數據的回溯,基本等 ...
  • hive入門到精通 hive部署 啟動Hadoop # 啟動hadoop start-all.sh # 檢查hadoop進程 jps # 檢查各埠 netstat -aplnt | grep java 檢查MySQL是否啟動成功 ps -aux | grep mysql netstat -apln ...
  • 一直從事資料庫相關的工作,對於PG而言最大的問題其實是在運維管理方面,其缺乏有效且直觀成體系的系統表,苦覓良久,今日在PG官網中發現了一款新收錄的免費插件,其提供了數十張系統表,內容涵蓋了從操作系統到資料庫的負載指標、等待事件、會話、客戶端、SQL、SQL執行計劃、超時鎖、長事務、資料庫對象、寫進程 ...
  • MySQL 8.0.28引入的新功能 MySQL 8.0.28開始,新增一個特性,支持監控統計並限制各個連接(會話)的記憶體消耗,避免大量用戶連接因為執行垃圾SQL消耗過多記憶體,造成可能被OOM kill的風險。 首先,需要先設置系統選項 global_connection_memory_tracki ...
  • 有沒有熟悉這樣的場景: 時間已過十一點,空蕩蕩的辦公室只剩自己孤身一人。陪你伏案忙碌的只有電腦風扇被迫營業的“嗡嗡”聲, 窗外的夜正黑得帶勁,仿佛巨獸的口吞噬自己的無奈。 天性善良不善言辭的你,容易被人頤指氣使,加班對你來說是家常便飯。 作為一名碼農,“我到底哪裡錯了,我需要怎麼解決?”是我的座右銘 ...
  • Cypress 是一個非常流行的測試工具,然而實際使用過程中發現一些問題,這裡做些記錄。 問題發現 在 Cypress 下 click 是非常常用的指令,然而在一些特殊場景下 click 並不能如想象中那般正常工作。 比如現在有一個彈窗,我們需要測試在點擊遮罩層時是否可以正常關閉彈窗。 測試代碼比較 ...
  • vue2採用了頭尾雙指針的方法,每次比對時,優先進行頭頭、尾尾、頭尾、尾頭的比對嘗試,如果都沒有命中才會進行亂序比對。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...