JavaScript數組操作指南:20個精通操作技巧指南

splice、?slice、?pop?和?shift。數組的排序方法是穩定且非原地算法的嗎?要記住所有 JavaScript 數組方法以及它們之間的區別并不容易。它們的名稱相似,就好像直接從同義詞詞典中提取一樣。

這個數組速查表列出了 JavaScript 中通常需要的所有數組方法,以及不需要的方法都不包含在內。就是這么簡單!為了讓您更容易理解,我基于常見用例制作了這個速查表。

在我們開始之前,關于不可變性(Immutability)有一點需要注意。本文中使用的所有函數都是不可變的,簡而言之,這意味著在使用這些方法時,您永遠不會改變原始數組。不可變性在現代 JavaScript 中非常重要。

Stack Overflow?中對?Immutability?的理解。

盡管這些方法在各自的操作中都是不可變的,但您仍然不能完全確保不可變性。如果在不可變數組中包含可變數據類型(數組、對象、函數),您仍然可以修改數組內部的可變數據。我們將這種數組稱為淺不可變數組,與深不可變數組相對,后者僅包含不可變項。

  1. 在數組的開頭添加元素

    要將一個項目添加到數組的開頭,使用數組擴展(array spreading)。不要使用?unshift?方法,因為它會修改原始數組。

    const arr = [1, 2, 3];
    const result = [0, ...arr];
    console.log(result);
    // [0, 1, 2, 3]
    
  2. 在數組的末尾添加元素

    要在數組的末尾追加一個項目,使用數組展開(array spreading)。不要使用?push?方法,因為它會修改原始數組。

    const arr = [1, 2, 3];
    const result = [...arr, 4];
    console.log(result);
    // [1, 2, 3, 4]
    
  3. 從數組的開頭移除一個元素

    要移除數組中的第一個項目,使用?slice?方法。不要使用?shift?或?splice?方法,因為它們會修改原始數組。

    const arr = [1, 2, 3];
    // 保留索引1及其之后的所有元素
    const result = arr.slice(1);
    console.log(result);
    // [2, 3]
    
  4. 從數組的末尾移除一個元素

    要移除數組中的最后一個項目,使用?slice?方法。不要使用?pop?或?splice?方法,因為它們會修改原始數組。

    const arr = [1, 2, 3];
    // 保留索引0及其之后的所有元素,除了數組中的一個元素。
    const result = arr.slice(0, -1);
    console.log(result);
    // [1, 2]
    
  5. 在數組中的特定索引位置插入元素

    要在數組的特定索引位置添加一個元素,可以使用?toSpliced?方法。不要使用?splice?方法,因為它會修改原始數組。

    const arr = [1, 2, 3];
    // 保留索引1,刪除0個元素,在索引1插入元素 "one point five",并保留其后的所有元素。
    const result = arr.toSpliced(1, 0, "one point five");
    console.log(result);
    // [1, "one point five", 2, 3]
    
  6. 在數組中替換特定索引位置的元素

    要在數組中替換特定索引位置的元素,可以使用?toSpliced?或?with?方法。不要使用?splice?方法,因為它會修改原始數組。

    const arr = [1, 2, 3];
    ?
    // 使用 toSpliced。
    // 保留索引1,刪除1個元素,在索引1插入元素 "two",并保留其后的所有元素。
    const result1 = arr.toSpliced(1, 1, "two");
    console.log(result1);
    // [1, "two", 3]
    ?
    // 使用 with。
    // 復制舊數組 arr,將索引1替換為 "two"。
    const result2 = arr.with(1, "two");
    console.log(result2);
    // [1, "two", 3]
    
  7. 從數組中刪除特定索引位置的元素

    要從數組中移除一個項,可以使用?toSpliced?方法。不要使用?splice?方法,因為它會修改原始數組。

    const arr = [1, 2, 3];
    ?
    // 在索引1處刪除1個元素。
    const result = arr.toSpliced(1, 1);
    console.log(result);
    // [1, 3]
    
  8. 從數組中根據值移除一個元素

    要從數組中刪除特定的值,可以使用?filter?方法。不要將?indexOf?與?splice?方法一起使用,因為它會修改原始數組。

    const arr = [1, 2, 3];
    const result = arr.filter((element) => element !== 2);
    console.log(result);
    // [1, 3]
    
  9. 從數組中根據屬性移除對象

    要從數組中刪除具有特定屬性的對象,可以使用?filter?方法。不要將?findIndex?與?splice?方法一起使用,因為它會修改原始數組。

    const arr = [{ num: 1 }, { num: 2 }, { num: 3 }];
    const result = arr.filter((obj) => obj.num !== 2);
    console.log(result);
    // [{ num: 1 }, { num: 3 }]
    
  10. 檢查數組是否包含一個元素

    要檢查數組是否包含一個值,可以使用?includes?方法。

    const arr = [1, 2, 3];
    const result = arr.includes(2);
    console.log(result);
    // true
    
  11. 檢查數組是否包含具有特定屬性的對象

    要檢查數組是否包含具有特定屬性的對象,可以使用?some?方法。

    const arr = [{ num: 1 }, { num: 2 }, { num: 3 }];
    const result = arr.some((obj) => obj.num === 2);
    console.log(result);
    // true
    
  12. 檢查數組中的所有對象是否都具有特定屬性

    要檢查數組中的每個對象是否都具有特定屬性,可以使用?every?方法。

    const arr1 = [{ num: 1 }, { num: 2 }, { num: 3 }];
    const result1 = arr1.every((obj) => obj.num === 2);
    console.log(result1);
    // false
    ?
    const arr2 = [{ num: 2 }, { num: 2 }, { num: 2 }];
    const result2 = arr2.every((obj) => obj.num === 2);
    console.log(result2);
    // true
    
  13. 將數組轉換為對象

    要將數組轉換為自定義對象,可以使用?reduce?方法。

    // 將鍵映射到值的函數。
    const arr1 = [1, 2, 3];
    const result1 = arr1.reduce((acc, cur, index) => {acc[`attr${index}`] = cur;return acc;
    }, {});
    console.log(result1);
    // { attr0: 1, attr1: 2, attr2: 3 }
    ?
    // 一個計算出現次數的函數可能如下所示。
    const arr2 = ["a", "b", "c", "c"];
    const result2 = arr2.reduce((acc, cur) => {if (acc[cur]) {acc[cur] += 1;} else {acc[cur] = 1;}return acc;
    }, {});
    console.log(result2);
    // { a: 1, b: 1, c: 2 })
    ?
    // 將數組元素映射到布爾值的函數可以如下所示。
    // 即,將數組轉換為對象鍵。
    const arr3 = ["a", "b", "c"];
    const truthValues = ["b", "c"];
    const result3 = arr3.reduce((acc, cur) => {acc[cur] = truthValues.includes(cur);return acc;
    }, {});
    console.log(result3);
    // { a: false, b: true, c: true }
    
  14. 將對象數組轉換為對象

    要將對象數組轉換為對象,可以使用?Object.assign方法和數組擴展語法。

    const arr = [{ attr1: 1 }, { attr2: 2 }, { attr3: 3 }];
    const result = Object.assign({}, ...arr);
    console.log(result);
    // { attr1: 1, attr2: 2, attr3: 3 }
    
  15. 將對象轉換為數組

    要從對象創建一個數組,可以使用?Object.keysObject.values?或?Object.entries?方法,可能與?map?方法一起使用。

    const obj = { a: 1, b: 2, c: 3 };
    ?
    // 鍵的數組。
    const result1 = Object.keys(obj);
    console.log(result1);
    // ["a", "b", "c"]
    ?
    // 值的數組。
    const result2 = Object.values(obj);
    console.log(result2);
    // [1, 2, 3]
    ?
    // 鍵值對象的數組。
    const result3 = Object.entries(obj).map(([key, value]) => ({ key, value }));
    console.log(result3);
    // [{ key: "a", value: 1 }, { key: "b", value: 2 }, { key: "c", value: 3 }]
    

    在某些情況下,可以鏈式使用一些?map?和?filter方法來修改和篩選值。

    const obj = { a: 1, b: 2, c: 3 };
    ?
    // 具有平方值大于3的值的數組。
    const result1 = Object.values(obj).map((value) => value * value).filter((value) => value > 3);
    console.log(result1);
    // [4, 9]
    ?
    // 具有值大于1的鍵值對象的數組。
    const result2 = Object.entries(obj).map(([key, value]) => ({ key, value })).filter((keyValueObj) => keyValueObj.value > 1);
    console.log(result2);
    // [{ key: "b", value: 2 }, { key: "c", value: 3 }]
    
  16. 合并兩個數組

    要合并兩個 JavaScript 數組,可以使用?concat?方法或數組的擴展語法。不要使用?push?方法,因為它會修改原始數組。

    const arr1 = [1, 2, 3];
    const arr2 = [4, 5, 6];
    ?
    // 使用 concat 方法更快。
    const combinedArray1 = arr1.concat(arr2);
    console.log(combinedArray1);
    // [1, 2, 3, 4, 5, 6]
    ?
    // 使用擴展語法可能更可讀。
    const combinedArray2 = [...arr1, ...arr2];
    console.log(combinedArray2);
    // [1, 2, 3, 4, 5, 6]
    
  17. 對數組進行排序

    如果要按值對數組進行排序,可以使用?toStorted方法。toStorted?方法是穩定的,這意味著它會保持相互相等的元素的順序不變。而且,該方法是非原地的,通常這是一件好事,因為它不會修改現有的數組。不要使用?sort?方法,因為它會進行原地排序,從而修改原始數組。

    // 對字符串進行排序。
    let arr1 = ["b", "c", "a"];
    const result1 = arr1.toSorted();
    console.log(result1);
    // ["a", "b", "c"]
    ?
    // 注意:數字是按其 toString 值進行排序的,而不是按其數值進行排序的!
    const arr2 = [10, 1, 5];
    const result2 = arr2.toSorted();
    console.log(result2);
    // [1, 10, 5]
    ?
    // 若要對數字進行排序,可以使用比較器。
    const arr3 = [10, 1, 5];
    const result3 = arr3.toSorted((a, b) => a - b);
    console.log(result3);
    // [1, 5, 10]
    
  18. 對對象數組進行排序

    要按值對數組進行排序,請使用具有比較函數的?toStorted?方法。比較函數用于確定兩個值中哪個應該首先排序。toStorted?方法是穩定的,這意味著它會保持相互相等的元素的順序不變。此方法不會原地排序,通常這是一件好事,因為它不會修改現有的數組。不要使用?sort?方法,因為它會修改原始數組。

    const arr = [{ num: 3 }, { num: 1 }, { num: 2 }];
    ?
    // 如果比較函數返回正值,objA 將在 objB 之前排序。
    const byNumberAttribute = (objA, objB) => objA.num - objB.num;
    const result1 = arr.toSorted(byNumberAttribute);
    console.log(result1);
    // [{ num: 1 }, { num: 2 }, { num: 3 }]
    ?
    // 更通用的比較函數。
    const byAttribute = (attr) => (objA, objB) => objA[attr] - objB[attr];
    const result2 = arr.toSorted(byAttribute("num"));
    console.log(result2);
    // [{ num: 1 }, { num: 2 }, { num: 3 }]
    ?
    // 注意:比較函數必須返回整數值。
    // 如果需要對其他數據類型進行排序,可以返回 1、0 或 -1。
    const arr3 = [{ letter: "c" }, { letter: "a" }, { letter: "b" }];
    const alphabetically = (objA, objB) => {if (objA.letter < objB.letter) {return -1;}
    ?if (objA.letter > objB.letter) {return 1;}
    ?// objA === objBreturn 0;
    };
    const result3 = arr3.toSorted(alphabetically);
    console.log(result3);
    // [{ letter: 'a' }, { letter: 'b' }, { letter: 'c' }]
    
  19. 反轉數組

    要反轉數組中的所有值,請使用?toReversed?方法。

    const arr = [1, 2, 3];
    const result = arr.toReversed(2);
    console.log(result);
    // [3, 2, 1]
    
  20. 從數組中移除重復項

    要從數組中移除重復的元素,可以使用?filter?方法或使用集合(Set)。

    const arr = [1, 2, 3, 2, 1];
    ?
    // 使用 filter 方法。
    const result1 = arr.filter((item, index) => arr.indexOf(item) === index);
    console.log(result1);
    // [1, 2, 3]
    ?
    // 使用 Set。
    const result2 = [...new Set(arr)];
    console.log(result2);
    // [1, 2, 3]
    

在這篇博客中,我們深入研究了JavaScript數組的20個必備高效技巧,旨在幫助您更智能、更高效地處理數組數據。我們從數組的基礎操作開始,逐步引導您掌握更高級的技能。

我們學到了如何在數組的開頭和末尾添加、移除元素,以及如何在特定索引位置插入、替換和刪除元素,而不會影響原始數組。我們了解了如何檢查數組中是否包含特定元素,以及如何將數組轉換為對象或對象數組轉換為對象或數組。我們還探討了如何合并兩個數組,對數組進行排序,包括對象數組,以及如何反轉數組和去除重復項。

這些技巧不僅僅是一堆代碼示例,它們代表了更深刻的概念,涉及到JavaScript中數組操作的核心原則。通過掌握這些技巧,您將能夠:

  • 編寫更整潔、可讀和高效的代碼。
  • 更智能地處理數組數據,無論是在前端還是后端開發中。
  • 解決各種常見問題,從數據過濾到數據轉換和排序。
  • 提高您的編碼技能,使您成為JavaScript數組操作的專家。

不管您是新手還是經驗豐富的開發者,這些技巧都將成為您工具箱中的寶貴資產。JavaScript數組是開發中不可或缺的一部分,精通數組操作將使您的項目更具競爭力。

如果您想更深入地了解這些技巧,我鼓勵您動手實踐。嘗試在自己的項目中應用它們,以加深理解。最重要的是,保持好奇心,不斷學習和探索,因為JavaScript的世界充滿了無限的可能性。

感謝您閱讀這篇博客,希望它為您提供了有價值的知識,幫助您在JavaScript數組操作中取得更大的成功。如果您有任何問題或反饋,請隨時與我聯系。愿您的編碼之路充滿挑戰和成就! 🚀

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

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

相關文章

Gson使用Object接收長數字問題

近期發現公司同事在使用Gson對數字進行反序列列化時出現丟失精度的問題&#xff0c;在這里搬運一下&#xff0c;做個記錄~ 現象 使用Gson反序列化長Long數字(大于16位),如果用Object類型來接收則會丟失精度。 Gson會將數字反序列化為double類型,double類型本身就容易丟精度。…

小程序基礎

小程序基礎 1. 認識什么是小程序 什么是微信小程序 微信小程序是一種運行在微信內部的 輕量級 應用程序。 在使用小程序時 不需要下載安裝&#xff0c;用戶 掃一掃 或 搜一下 即可打開應用。它也體現了 “用完即走” 的理念&#xff0c;用戶不用關心安裝太多應用的問題。它…

weak的實現原理

iOS 在運行時維護著一個全局的弱引用表&#xff0c;該表是一個 hash 表&#xff0c;hash表的 key 是 對象本身&#xff0c;value 是指向該對象的所有 weak 指針的地址數組。 /**全局的弱引用表&#xff0c;本質是一個hash結構&#xff0c;對象本身作為key, 存儲weak修飾的指…

大模型訓練經驗

1.模型訓練好后預測全是起始符號。 解決辦法&#xff1a;訓練數據的輸入輸出去掉起始符號。 2.模型訓練后學不到有效信息。 加大epoch&#xff0c;我加大到了1000。 3.模型訓練后預測沒有結束符&#xff0c;暫時未解&#xff0c;另外&#xff0c;發現當訓練不足時&#xff…

Metasploit安裝及使用教程(非常詳細)從零基礎入門到精通,看完這一篇就夠了。

通過本篇文章&#xff0c;我們將會學習以下內容&#xff1a; 1、在Windows上安裝Metasploit 2、在Linux和MacOS上安裝Metasploit 3、在Kali Linux中使用 Metasploit 4、升級Kali Linux 5、使用虛擬化軟件構建滲透測試實驗環境 6、配置SSH連接 7、使用SSH連接Kali 8、配…

如何學習自然語言處理之語言模型

自然語言處理&#xff08;NLP&#xff09;是一種人工智能技術&#xff0c;它使計算機能夠理解和處理人類語言。而語言模型是NLP中的一個重要概念&#xff0c;主要是用來估測一些詞的序列的概率&#xff0c;即預測p(w1, w2, w3 … wn)&#xff0c;其中一個應用就是句子的生成。 …

JVM運行流程

? 作者&#xff1a;小胡_不糊涂 &#x1f331; 作者主頁&#xff1a;小胡_不糊涂的個人主頁 &#x1f4c0; 收錄專欄&#xff1a;JavaEE &#x1f496; 持續更文&#xff0c;關注博主少走彎路&#xff0c;謝謝大家支持 &#x1f496; JVM 1. 運行流程2. 運行時數據區2.1 堆&am…

ubuntu新建ap熱點并分享

測試環境ubuntu16,只有一臺筆記本電腦&#xff0c;不插網線&#xff0c;無線網卡既連wifi&#xff0c;又作為熱點 1.方法1 直接手動新建ap熱點 參考https://jingyan.baidu.com/article/ea24bc39b03fc6da62b331f0.html https://jingyan.baidu.com/article/363872ecd8f35d6e4ba…

機試指南:Ch5:線性數據結構 Ch6:遞歸與分治

文章目錄 第5章 線性數據結構1.向量 vector2.隊列 queue(1)隊列的特點、應用(2)基本操作(3)例題例題1&#xff1a;約瑟夫問題2 &#xff08;難度&#xff1a;中等&#xff09; (4)習題習題1&#xff1a;排隊打飯 &#xff08;難度&#xff1a;中等&#xff09; 3.棧 stack(1)棧…

前端 JS 經典:Content-type 詳解

1. 什么是 Content-Type Content-Type 是 HTTP 協議中的一個請求頭或響應頭字段&#xff0c;用于指示發送或接收的實體的媒體類型&#xff0c;告訴服務器或客戶端如何解析和處理請求或響應的主體部分。 2. Content-Type 的構成 Content-Type 由兩部分組成&#xff1a;媒體類型…

視頻在線壓縮

video2edit 一款免費的在線視頻編輯軟件&#xff0c;可以進行視頻合并、視頻剪輯、視頻壓縮以及轉換視頻格式等。 鏈接地址&#xff1a;在線視頻編輯器和轉換器 - 編輯&#xff0c;轉換和壓縮視頻文件 打開視頻壓縮頁面&#xff0c;上傳想要壓縮視頻&#xff0c;支持MP4&…

收入穩步增長 助力持續發展 尼康發布截至2024年3月財年第三季度財報

近日&#xff0c;尼康截至2024年3月財年的第三季度&#xff08;2023年10月1日-2023年12月31日&#xff09;財報正式發布。數據顯示&#xff0c;尼康集團第三財季銷售收入共計1977億日元&#xff0c;較去年同期上漲300億日元&#xff0c;漲幅約17.9%。其中影像業務領域&#xff…

Java面試題:解釋Java內存模型中的內存順序規則,Java中的線程組(ThreadGroup)的工作原理,Java中的FutureTask的工作原理

引言 在Java開發領域&#xff0c;內存模型、多線程和并發是三個至關重要的概念&#xff0c;它們直接影響到程序的性能、穩定性和可擴展性。作為面試官&#xff0c;考察候選人對這些概念的理解和應用能力是評估其技術水平的重要手段。本文將提供三道涉及這些核心知識點的面試題…

視頻記錄儀_基于聯發科MT6762的智能4G記錄儀方案

智能記錄儀采用聯發科強勁八核處理器&#xff0c;12nm制程工藝的記錄儀具便是滿足這些需求的理想選擇。搭載4GB32GB內存&#xff0c;并運行Android 11.0操作系統&#xff0c;這款記錄儀具展現出強勁的性能表現。 首先&#xff0c;這款記錄儀具具備優秀的視頻錄制功能。它能完整…

WPS如何共享文件和文件夾

1 WPS共享單個文件 用WPS打開要分享的文件&#xff0c;點擊右上角的“分享”鍵&#xff0c;選擇上傳到云端。 之后點擊“創建并分享”&#xff0c;即可分享該文檔。 2 WPS創建共享文件夾 2.1 如何共享文件夾 首先打開WPS&#xff0c;點擊左上角的首頁。在首頁欄中&#…

Ubuntu系統下DPDK環境搭建

目錄 一.虛擬機配置1.添加一個網卡(橋接模式)2.修改網卡類型3.修改網卡名稱4.重啟虛擬機5.查看網卡信息6.dpdk配置內存巨型頁 三 DPDK源代碼下載和編譯1.下載源代碼2.解壓源代碼3.安裝編譯環境4.編譯5.設置dpdk的環境變量6.禁止多隊列網卡7.加載igb_uio模塊8.網卡綁定9.驗證測試…

Vue3自定義文章列表組件

一、Vue3的代碼展示 <template><div><div v-for"article in articles" :key"article.id" class"article-card"><div class"author-info"><img :src"article.avatar" alt"Author Avatar&qu…

Android 驗證啟動模式

文章目錄 Android 驗證啟動模式查看任務棧launchModestandardsingleTopsingleTasksingleInstance Intent標記FLAG_ACTIVITY_NEW_TASKFLAG_ACTIVITY_CLEAR_TASK 和 FLAG_ACTIVITY_NEW_TASKFLAG_ACTIVITY_CLEAR_TOPFLAG_ACTIVITY_SINGLE_TOP Android 驗證啟動模式 查看任務棧 可…

軟考52-上午題-【數據庫】-關系模式2

一、關系模式的回顧 見&#xff1a;軟考38-上午題-【數據庫】-關系模式 二、關系模式 2-1、關系模式的定義 示例&#xff1a; 念法&#xff1a;A——>B A決定B&#xff0c;或者&#xff0c;B依賴于A。 2-2、函數依賴 1、非平凡的函數依賴 如果X——>Y&#xff0c;&a…

Linux Shell腳本練習(三)

1、測試用戶名與密碼是否正確。 2、輸出1-1000內的素數。 3、對 100 以內的所有正整數相加求和(1234...100)。 4、輸出9*9 乘法表。 5、編寫腳本,顯示進度條。 、 6、輸入三個數并進行升序排序