JavaScript中集合常用操作方法詳解

JavaScript中集合常用操作方法詳解

JavaScript中的集合主要包括數組(Array)、集合(Set)和映射(Map)。下面我將詳細介紹這些集合類型的常用操作方法。

數組(Array)

數組是JavaScript中最常用的集合類型,提供了豐富的操作方法。

創建數組

// 字面量創建
const arr1 = [1, 2, 3, 4, 5];// 構造函數創建
const arr2 = new Array(1, 2, 3, 4, 5);// 創建指定長度的空數組
const arr3 = new Array(5); // 創建長度為5的空數組// Array.from方法從類數組對象或可迭代對象創建數組
const arr4 = Array.from('hello'); // ['h', 'e', 'l', 'l', 'o']// Array.of方法創建包含所有參數的數組
const arr5 = Array.of(1, 2, 3); // [1, 2, 3]

添加和刪除元素

const arr = [1, 2, 3];// 末尾添加元素
arr.push(4, 5);  // 返回新長度 5,arr變為[1, 2, 3, 4, 5]// 開頭添加元素
arr.unshift(0);  // 返回新長度 6,arr變為[0, 1, 2, 3, 4, 5]// 末尾刪除元素
const last = arr.pop();  // 返回刪除的元素 5,arr變為[0, 1, 2, 3, 4]// 開頭刪除元素
const first = arr.shift();  // 返回刪除的元素 0,arr變為[1, 2, 3, 4]// 任意位置添加/刪除元素
// splice(起始索引, 刪除數量, 添加的元素...)
arr.splice(1, 1, 'a', 'b');  // 返回刪除的元素數組 [2],arr變為[1, 'a', 'b', 3, 4]

查找元素

const arr = [1, 2, 3, 4, 5, 3];// indexOf查找元素首次出現的索引
const index1 = arr.indexOf(3);  // 2// lastIndexOf查找元素最后一次出現的索引
const index2 = arr.lastIndexOf(3);  // 5// includes檢查數組是否包含某元素
const hasThree = arr.includes(3);  // true// find返回第一個滿足條件的元素
const found = arr.find(item => item > 3);  // 4// findIndex返回第一個滿足條件的元素的索引
const foundIndex = arr.findIndex(item => item > 3);  // 3// findLast返回最后一個滿足條件的元素(ES2023)
const foundLast = arr.findLast(item => item < 4);  // 3// findLastIndex返回最后一個滿足條件的元素的索引(ES2023)
const foundLastIndex = arr.findLastIndex(item => item < 4);  // 5

遍歷數組

const arr = [1, 2, 3, 4, 5];// forEach遍歷數組
arr.forEach((item, index) => {console.log(`索引${index}: ${item}`);
});// map創建一個新數組,其結果是對原數組每個元素調用函數處理后的值
const doubled = arr.map(item => item * 2);  // [2, 4, 6, 8, 10]// filter創建一個新數組,包含通過所提供函數測試的所有元素
const evens = arr.filter(item => item % 2 === 0);  // [2, 4]// reduce對數組中的每個元素執行一個reducer函數,將其結果匯總為單個返回值
const sum = arr.reduce((acc, curr) => acc + curr, 0);  // 15// reduceRight從右到左應用reduce
const rightSum = arr.reduceRight((acc, curr) => acc + curr, 0);  // 15// some檢查是否至少有一個元素通過了測試
const hasEven = arr.some(item => item % 2 === 0);  // true// every檢查是否所有元素都通過了測試
const allEven = arr.every(item => item % 2 === 0);  // false

排序和反轉

const arr = [3, 1, 4, 1, 5, 9];// sort對數組元素進行排序(默認按字符串順序)
arr.sort();  // [1, 1, 3, 4, 5, 9]// 自定義排序
arr.sort((a, b) => b - a);  // [9, 5, 4, 3, 1, 1] 降序// reverse反轉數組
arr.reverse();  // [1, 1, 3, 4, 5, 9]

數組轉換和復制

const arr = [1, 2, 3, 4, 5];// join將數組元素連接成字符串
const str = arr.join('-');  // "1-2-3-4-5"// slice返回數組的一部分,不修改原數組
const sliced = arr.slice(1, 4);  // [2, 3, 4]// concat合并兩個或多個數組
const combined = arr.concat([6, 7], [8, 9]);  // [1, 2, 3, 4, 5, 6, 7, 8, 9]// 展開運算符復制數組
const copy = [...arr];  // [1, 2, 3, 4, 5]// flat將嵌套數組扁平化
const nested = [1, [2, [3, 4]]];
const flattened = nested.flat(2);  // [1, 2, 3, 4]// flatMap先映射再扁平化
const flatMapped = arr.flatMap(x => [x, x * 2]);  // [1, 2, 2, 4, 3, 6, 4, 8, 5, 10]

集合(Set)

Set是一種存儲唯一值的集合類型。

基本操作

// 創建Set
const set = new Set([1, 2, 3, 3, 4]);  // {1, 2, 3, 4}// 添加元素
set.add(5);  // 返回Set本身,set變為{1, 2, 3, 4, 5}// 檢查元素是否存在
const hasThree = set.has(3);  // true// 刪除元素
set.delete(3);  // 返回true表示刪除成功,set變為{1, 2, 4, 5}// 獲取元素數量
const size = set.size;  // 4// 清空Set
set.clear();  // set變為{}

遍歷Set

const set = new Set([1, 2, 3, 4, 5]);// forEach遍歷
set.forEach(value => {console.log(value);
});// 使用for...of遍歷
for (const value of set) {console.log(value);
}// 轉換為數組
const arr = [...set];  // [1, 2, 3, 4, 5]// 獲取迭代器
const values = set.values();  // SetIterator {1, 2, 3, 4, 5}
const entries = set.entries();  // SetIterator {[1, 1], [2, 2], [3, 3], [4, 4], [5, 5]}

Set集合操作

const setA = new Set([1, 2, 3, 4]);
const setB = new Set([3, 4, 5, 6]);// 并集
const union = new Set([...setA, ...setB]);  // {1, 2, 3, 4, 5, 6}// 交集
const intersection = new Set([...setA].filter(x => setB.has(x)));  // {3, 4}// 差集
const difference = new Set([...setA].filter(x => !setB.has(x)));  // {1, 2}

映射(Map)

Map是一種鍵值對集合,可以使用任何類型作為鍵。

基本操作

// 創建Map
const map = new Map([['key1', 'value1'],['key2', 'value2']
]);// 添加或更新鍵值對
map.set('key3', 'value3');  // 返回Map本身// 獲取值
const value = map.get('key1');  // "value1"// 檢查鍵是否存在
const hasKey = map.has('key2');  // true// 刪除鍵值對
map.delete('key2');  // 返回true表示刪除成功// 獲取鍵值對數量
const size = map.size;  // 2// 清空Map
map.clear();  // map變為空Map

遍歷Map

const map = new Map([['name', '張三'],['age', 30],['job', '工程師']
]);// forEach遍歷
map.forEach((value, key) => {console.log(`${key}: ${value}`);
});// 使用for...of遍歷
for (const [key, value] of map) {console.log(`${key}: ${value}`);
}// 獲取所有鍵
const keys = [...map.keys()];  // ["name", "age", "job"]// 獲取所有值
const values = [...map.values()];  // ["張三", 30, "工程師"]// 獲取所有鍵值對
const entries = [...map.entries()];  // [["name", "張三"], ["age", 30], ["job", "工程師"]]

Map與對象轉換

// 對象轉Map
const obj = { name: '張三', age: 30 };
const mapFromObj = new Map(Object.entries(obj));  // Map(2) {"name" => "張三", "age" => 30}// Map轉對象
const map = new Map([['name', '張三'],['age', 30]
]);
const objFromMap = Object.fromEntries(map);  // {name: "張三", age: 30}

WeakMap和WeakSet

WeakMap和WeakSet是特殊的集合類型,它們持有對對象的弱引用,不會阻止垃圾回收。

// WeakMap示例
const weakMap = new WeakMap();
let obj = { id: 1 };
weakMap.set(obj, 'metadata');// WeakSet示例
const weakSet = new WeakSet();
let obj2 = { id: 2 };
weakSet.add(obj2);

實用技巧

數組去重

// 使用Set去重
const array = [1, 2, 2, 3, 4, 4, 5];
const uniqueArray = [...new Set(array)];  // [1, 2, 3, 4, 5]

數組交集

const arr1 = [1, 2, 3, 4];
const arr2 = [3, 4, 5, 6];
const intersection = arr1.filter(item => arr2.includes(item));  // [3, 4]

數組分組(ES2023)

const people = [{ name: '張三', age: 25 },{ name: '李四', age: 30 },{ name: '王五', age: 25 }
];// 按年齡分組
const groupedByAge = Object.groupBy(people, person => person.age);
/*
{"25": [{ name: '張三', age: 25 }, { name: '王五', age: 25 }],"30": [{ name: '李四', age: 30 }]
}
*/

對象轉Map的應用場景

// 頻率計數
const array = ['apple', 'banana', 'apple', 'orange', 'banana', 'apple'];
const frequencyMap = array.reduce((map, item) => {map.set(item, (map.get(item) || 0) + 1);return map;
}, new Map());// 結果: Map(3) {"apple" => 3, "banana" => 2, "orange" => 1}

以上就是JavaScript中集合常用操作方法的詳細介紹。這些方法能夠幫助你高效地處理數據集合,實現各種復雜的數據操作需求。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/73805.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/73805.shtml
英文地址,請注明出處:http://en.pswp.cn/web/73805.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【HC-05】藍牙串口通信模塊調試與應用(1)

一、HC-05 基礎學習視頻 HC-05藍牙串口通信模塊調試與應用1 二、HC-05學習視頻課件

【學Rust寫CAD】18 定點數2D仿射變換矩陣結構體(MatrixFixedPoint結構別名)

源碼 // matrix/fixed.rs use crate::fixed::Fixed; use super::generic::Matrix;/// 定點數矩陣類型別名 pub type MatrixFixedPoint Matrix<Fixed, Fixed, Fixed, Fixed, Fixed, Fixed>;代碼解析 這段代碼定義了一個定點數矩陣的類型別名 MatrixFixedPoint&#xff…

axios文件下載使用后端傳遞的名稱

java后端通過HttpServletResponse 返回文件流 在Content-Disposition中插入文件名 一定要設置Access-Control-Expose-Headers&#xff0c;代表跨域該Content-Disposition返回Header可讀&#xff0c;如果沒有&#xff0c;前端是取不到Content-Disposition的&#xff0c;可以在統…

HarmonyOS之深入解析如何根據url下載pdf文件并且在本地顯示和預覽

一、文件下載 ① 網絡請求配置 下載在線文件&#xff0c;需要訪問網絡&#xff0c;因此需要在 config.json 中添加網絡權限&#xff1a; {"module": {"requestPermissions": [{"name": "ohos.permission.INTERNET","reason&qu…

鴻蒙前后端項目源碼-點餐v3.0-原創!原創!原創!

鴻蒙前后端點餐項目源碼含文檔ArkTS語言. 原創作品.我半個月寫的原創作品&#xff0c;請尊重原創。 原創作品&#xff0c;盜版必究&#xff01;&#xff01;&#xff01;&#xff01; 原創作品&#xff0c;盜版必究&#xff01;&#xff01;&#xff01;&#xff01; 原創作…

VUE3+TypeScript項目,使用html2Canvas+jspdf生成PDF并實現--分頁--頁眉--頁尾

使用html2CanvasJsPDF生成pdf&#xff0c;并實現分頁添加頁眉頁尾 1.封裝方法htmlToPdfPage.ts /**path: src/utils/htmlToPdfPage.tsname: 導出頁面為PDF格式 并添加頁眉頁尾 **/ /*** 封裝思路* 1.將頁面根據A4大小分隔邊距&#xff0c;避免內容被中間截斷* 所有元素層級不要…

5.Excel:從網上獲取數據

一 用 Excel 數據選項卡獲取數據的方法 連接。 二 要求獲取實時數據 每1分鐘自動更新數據。 A股市場_同花順行情中心_同花順財經網 用上面方法將數據加載進工作表中。 在表格內任意區域右鍵&#xff0c;刷新。 自動刷新&#xff1a; 三 缺點 Excel 只能爬取網頁上表格類型的…

《深度剖析SQL之WHERE子句:數據過濾的藝術》

在當今數據驅動的時代&#xff0c;數據處理和分析能力已成為職場中至關重要的技能。SQL作為一種強大的結構化查詢語言&#xff0c;在數據管理和分析領域占據著核心地位。而WHERE子句&#xff0c;作為SQL中用于數據過濾的關鍵組件&#xff0c;就像是一把精準的手術刀&#xff0c…

華為eNSP-配置靜態路由與靜態路由備份

一、靜態路由介紹 靜態路由是指用戶或網絡管理員手工配置的路由信息。當網絡拓撲結構或者鏈路狀態發生改變時&#xff0c;需要網絡管理人員手工修改靜態路由信息。相比于動態路由協議&#xff0c;靜態路由無需頻繁地交換各自的路由表&#xff0c;配置簡單&#xff0c;比較適合…

Docker 快速入門指南

Docker 快速入門指南 1. Docker 常用指令 Docker 是一個輕量級的容器化平臺&#xff0c;可以幫助開發者快速構建、測試和部署應用程序。以下是一些常用的 Docker 命令。 1.1 鏡像管理 # 搜索鏡像 docker search <image_name># 拉取鏡像 docker pull <image_name>…

基礎認證-單選題(一)

單選題 1、下列關于request方法和requestlnStream方法說法錯誤的是(C) A 都支持取消訂閱響應事件 B 都支持訂閱HTTP響應頭事件 C 都支持HttpResponse返回值類型 D 都支持傳入URL地址和相關配置項 2、如需修改Text組件文本的透明度可通過以下哪個屬性方法進行修改 (C) A dec…

Logback使用和常用配置

Logback 是 Spring Boot 默認集成的日志框架&#xff0c;相比 Log4j&#xff0c;它性能更高、配置更靈活&#xff0c;并且天然支持 Spring Profile 多環境配置。以下是詳細配置步驟及常用配置示例。 一、添加依賴&#xff08;非 Spring Boot 項目&#xff09; 若項目未使用 Sp…

MySQL基礎語法DDLDML

目錄 #1.創建和刪除數據庫 ?#2.如果有lyt就刪除,沒有則創建一個新的lyt #3.切換到lyt數據庫下 #4.創建數據表并設置列及其屬性,name是關鍵詞要用name包圍 ?編輯 #5.刪除數據表 #5.查看創建的student表 #6.向student表中添加數據,數據要與列名一一對應 #7.查詢studen…

在windows下安裝windows+Ubuntu16.04雙系統(下)

這篇文章的內容主要來源于這篇文章&#xff0c;為正式安裝windowsUbuntu16.04雙系統部分。在正式安裝前&#xff0c;若還沒有進行前期準備工作&#xff08;1.分區2.制作啟動u盤&#xff09;&#xff0c;見《在windows下安裝windowsUbuntu16.04雙系統(上)》 二、正式安裝Ubuntu …

Ubuntu24.04 離線安裝 MySQL8.0.41

一、環境準備 1.1 官方下載MySQL8.0.41 完整包 1.2 上傳包 & 解壓 上傳包名稱是&#xff1a;mysql-server_8.0.41-1ubuntu24.04_amd64.deb-bundle.tar # 切換到上傳目錄 cd /home/MySQL8 # 解壓&#xff1a; tar -xvf mysql-server_8.0.41-1ubuntu24.04_amd64.deb-bundl…

記錄一次Dell服務器更換內存條報錯解決過程No memory found

文章目錄 問題問題分析解決流程總結 問題 今天給服務器添加了幾個內存條&#xff0c;開啟后報錯 No memory found No useable DlMMs found. Verify the DlMMsare properly seated and that they are installed in the correct sockets. 問題分析 這個錯誤說明服務器在啟動時沒…

Apache HttpClient使用

一、Apache HttpClient 基礎版 HttpClients 是 Apache HttpClient 庫中的一個工具類&#xff0c;用于創建和管理 HTTP 客戶端實例。Apache HttpClient 是一個強大的 Java HTTP 客戶端庫&#xff0c;用于發送 HTTP 請求并處理 HTTP 響應。HttpClients 提供了多種方法來創建和配…

Maven版本統一管理

多模塊的項目&#xff0c;怎么方便管理 模塊的版本號呢&#xff1f; 可以使用 ${revision} 配合 flatten-maven-plugin插件 <plugin><groupId>org.codehaus.mojo</groupId><artifactId>flatten-maven-plugin</artifactId><version>1.1.0&…

時序數據庫 InfluxDB(一)

時序數據庫 InfluxDB&#xff08;一&#xff09; 數據庫種類有很多&#xff0c;比如傳統的關系型數據庫 RDBMS&#xff08; 如 MySQL &#xff09;&#xff0c;NoSQL 數據庫&#xff08; 如 MongoDB &#xff09;&#xff0c;Key-Value 類型&#xff08; 如 redis &#xff09…

E5071C數據保存教程:SNP文件/CSV導出+遠程傳輸步驟一鍵收藏

Keysight E5071C 網絡分析儀支持多種數據存儲方式&#xff0c;以下是詳細的操作步驟和注意事項&#xff1a; 1. 內部存儲&#xff08;儀器內存&#xff09; 保存測量數據&#xff1a; 軌跡數據&#xff1a;按 Save/Recall → Save Trace Data → 選擇存儲格式&#xff08;如 …