不是,你不會還在用雙層遍歷循環來做新舊數組對比,尋找新增元素吧?

目錄

一、雙層循環遍歷

1.1、雙循環錯誤示范

1.2、正確的做法

①使用array.includes()

②使用set

二、array.includes()的使用與技巧

2.1、基本語法

2.2、返回值

2.3、使用技巧

2.3.1、用戶輸入驗證

2.3.2、權限檢查

2.4、兼容問題

三、總結


一、雙層循環遍歷

1.1、雙循環錯誤示范

????????前幾天看項目,發現有個新舊數組對比,尋找新增元素的需求竟然是用for寫的雙循環。大概就像下面這樣:

// 假設這是兩個數組的真實數據
const array1 = [1, 2, 3, 4, 5, 6, 7, 8];
const array2 = [4, 5, 6, 7, 8];// 用來存儲不重復的元素
const uniqueElements = [];// 雙重循環遍歷兩個數組
for (let i = 0; i < array1.length; i++) {for (let j = 0; j < array2.length; j++) {// 檢查array1中的元素是否不在array2中if (array1[i] !== array2[j]) {uniqueElements.push(array1[i]);}}
}// 打印不重復的元素
console.log(uniqueElements);

????????太抽象了,這樣代碼的?給我一種21世紀用木頭刀槍打獵的感覺。還有的是這樣寫的:

// 假設這是兩個數組的真實數據
const array1 = [1, 2, 3, 4, 5, 6, 7, 8];
const array2 = [4, 5, 6, 7, 8];// 用來存儲不重復的元素
let uniqueElements = [];// 遍歷array1中的每個元素
array1.forEach(item1 => {// 用另一個forEach來檢查array1中的元素是否不在array2中let isUnique = array2.forEach((item2, index, array) => {return item1 === item2;});// 如果isUnique為false,說明item1不在array2中if (!isUnique) {uniqueElements.push(item1);}
});// 打印不重復的元素
console.log(uniqueElements); // 輸出: [1, 2, 3]

? ? ? ? 可是有什么區別嗎?forEach看起來是高級一點,但是沒有擺脫最基礎的邏輯啊,重點是雙循環很干,一點都不巧妙。基本的邏輯就是在滿足功能、需求和時間效率的基礎上,要盡可能少用循環,少用回調,大幅提高代碼的可讀性和可維護性。

1.2、正確的做法

①使用array.includes()

????????最基本的就是要會用array.includes()方法,可以少一次循環。

????????在這段代碼中,我們使用 forEach 方法遍歷 array1 中的每個元素。對于 array1 中的每個元素 item1,我們使用 includes 方法檢查它是否不在 array2 中。如果 item1 不在 array2 中,我們就將它添加到 uniqueElements 數組中。最后,我們打印出 uniqueElements 數組,它包含了 array1 中不在 array2 中的所有元素。

// 假設這是兩個數組的真實數據
const array1 = [1, 2, 3, 4, 5, 6, 7, 8];
const array2 = [4, 5, 6, 7, 8];// 用來存儲不重復的元素
let uniqueElements = [];// 遍歷array1中的每個元素
array1.forEach(item1 => {// 檢查array1中的元素是否不在array2中if (!array2.includes(item1)) {uniqueElements.push(item1);}
});// 打印不重復的元素
console.log(uniqueElements); // 輸出: [1, 2, 3]

②使用set

????????使用集合先去重,然后通過Set.has()方法來判斷新增元素。

????????在這個代碼中,我們首先創建了一個 Set 對象 set2 來存儲 array2 中的所有元素。然后,我們使用 forEach 方法遍歷 array1 中的每個元素 item1。對于 array1 中的每個元素,我們檢查它是否不在 set2 中。如果不在,我們將其添加到 uniqueElements 數組中。最后,我們打印出 uniqueElements 數組,它包含了 array1 中不在 array2 中的所有元素。

// 假設這是兩個數組的真實數據
const array1 = [1, 2, 3, 4, 5, 6, 7, 8];
const array2 = [4, 5, 6, 7, 8];// 創建一個集合來存儲array2中的元素,以便快速查找
const set2 = new Set(array2);// 用來存儲不重復的元素
const uniqueElements = [];array1.forEach(item1 => {// 檢查item1是否不在array2的集合中if (!set2.has(item1)) {uniqueElements.push(item1);}
});// 打印不重復的元素
console.log(uniqueElements); // 應該輸出: [1, 2, 3]

????????這樣是不是優雅很多?并且時間效率上也有提高。

? ? ? ? 既然談到這里,就簡單聊一下array.includes()吧。

二、array.includes()的使用與技巧

2.1、基本語法

arr.includes(searchElement[, fromIndex])

  • searchElement:需要檢查是否包含在數組中的元素。
  • fromIndex(可選):開始搜索的索引位置,默認值為 0。如果該值大于數組長度,則返回?false?并且不執行搜索。

2.2、返回值

  • 如果 searchElement 存在于數組中,返回 true。
  • 如果 searchElement 不存在于數組中,返回 false。

2.3、使用技巧

????????array.includes()用于判斷一個數組是否包含一個指定的值,根據情況返回 truefalse

2.3.1、用戶輸入驗證

????????在表單驗證中,我們可能需要檢查用戶輸入是否包含某些特定的字符或單詞。

const userInput = "Hello, World!";
const bannedWords = ["badword", "offensiveword"];if (bannedWords.some(word => userInput.includes(word))) {console.log("輸入包含禁止詞匯!");
} else {console.log("輸入有效。");
}

2.3.2、權限檢查

????????在權限管理系統中,includes() 可以用來檢查用戶是否具有執行特定操作的權限。

const userPermissions = ["read", "write", "delete"];
const requiredPermission = "delete";if (userPermissions.includes(requiredPermission)) {console.log("用戶有權限執行刪除操作。");
} else {console.log("用戶沒有權限執行刪除操作。");
}

2.4、兼容問題

????????array.includes() 方法在現代瀏覽器中得到廣泛支持,包括最新版本的 Chrome、Firefox、Safari、Edge 和 Opera。對于不支持 includes() 的舊瀏覽器,可以使用 Array.prototype.indexOf() 方法作為替代:

if (!Array.prototype.includes) {Array.prototype.includes = function(searchElement /*, fromIndex*/){'use strict';var O = Object(this);var len = parseInt(O.length, 10) || 0;if (len === 0) {return false;}var fromIndex = !fromIndex || fromIndex < 0 ? 0 : Math.floor(fromIndex);for (; fromIndex < len; fromIndex++) {if (fromIndex in O && O[fromIndex] === searchElement) {return true;}}return false;};
}

三、總結

? ? ? ? 這類問題的重點在于能不能突破基礎思路,突破基礎思路是從程序員入門變成中級甚至高級的第一步,如果所有需求都通過最基礎的業務邏輯來做,是得不到成長的。

????????豐富的前端內容請看:各種前端問題的技巧和解決方案

? ? ? ? 博客不應該只有代碼和解決方案,重點應該在于給出解決方案的同時分享思維模式,只有思維才能可持續地解決問題,只有思維才是真正值得學習和分享的核心要素。如果這篇博客能給您帶來一點幫助,麻煩您點個贊支持一下,還可以收藏起來以備不時之需,有疑問和錯誤歡迎在評論區指出~

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

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

相關文章

【重學C語言】十七、預處理指令

【重學C語言】十七、預處理指令 預處理指令預定義宏`#define` 宏定義示例注意事項特殊符號條件編譯頭文件包含`#pragma`預處理指令 C語言中的預處理指令(Preprocessor Directives)是一種特殊的指令,它們在編譯過程的早期階段(即實際編譯之前)被預處理器(Preprocessor)處…

OpenCV學習 基礎圖像操作(十六):圖像距離變換

基礎原理 顧名思義&#xff0c;我們可以利用像素之間的距離作為對該像素的一種刻畫&#xff0c;并將其運用到相應的計算之中。然而&#xff0c;在一幅圖像之中&#xff0c;某種類型的像素并不是唯一的&#xff0c;因此我門常計算的是一類像素到另一類的最小距離&#xff0c;并…

My Spirit | “頂級復盤”

世界不會在意你的自尊&#xff0c; 人們看到的只是你的成就。 在你沒有成就之前&#xff0c; 切勿過分強調自尊。 ——菲茨杰拉德《了不起的蓋茨比》 目錄 My Spirit | “頂級復盤”00 | 日復盤01 | 周復盤2.1 周計劃2.2 周復盤2.3 下步計劃2.4 下步總結 02 | 月復盤2.1 本月目…

香橙派KunPengPro評測

一、引言 二、開箱 2.1、主要包含說明 1、充電器(贈typec-c線) 2、香橙派kunpengpro(已經帶裝好帶散熱器) 3、SD卡(32G)(已經帶裝好系統openEuler 22.03 (LTS-SP3)) (注意&#xff1a;上電接HDMI線可直接用&#xff0c;賬號&#xff1a;openEuler 密碼&#xff1a;openEuler)…

vue使用tailwindcss

安裝依賴 pnpm add -D tailwindcss postcss autoprefixer創建配置文件tailwind.config.js npx tailwindcss init在配置文件content中添加所有模板文件的路徑 /** type {import(tailwindcss).Config} */ export default {content: [./index.html, ./src/**/*.{vue,js,ts,jsx,…

【Linux】開發工具入門指南,輕松掌握你的開發利器

開發工具 1. 軟件包管理器yum1.1 軟件包安裝方式1.2 yum的"三板斧"1.3 yum的周邊 2. 開發工具3. 編輯器vim4. 編譯器gcc、g5. 項目自動化構建工具make、Makefile6. 進度條小程序7. 調試器gdb 1. 軟件包管理器yum 1.1 軟件包安裝方式 源代碼安裝&#xff1a;用戶手動…

微信小程序 npm構建+vant-weaap安裝

微信小程序&#xff1a;工具-npm構建 報錯 解決&#xff1a; 1、新建miniprogram文件后&#xff0c;直接進入到miniprogram目錄&#xff0c;再次執行下面兩個命令&#xff0c;然后再構建npm成功 npm init -y npm install express&#xff08;Node js后端Express開發&#xff…

智慧校園的機遇與挑戰

隨著5G、物聯網、大數據等技能的日漸老練&#xff0c;數字化正在滲透到各行各業中&#xff0c;為事務立異和價值增加供給支撐。在教育職業&#xff0c;運用智能化體系賦能教育辦理越來越受歡迎&#xff0c;教育信息化方針一再出臺&#xff0c;進一步加快了智慧校園落地的腳步。…

Linux - 文件管理高級 sed

3.處理字符 sed ① sed 默認情況下不會修改原文件內容 ② sed 是一種非交互式的編輯器 3.1 工作原理 將原文件一行一行的進行處理&#xff0c;取出一行&#xff0c;放入“模式空間進行處理”&#xff0c;處理完成之后將結果輸出到屏幕上&#xff0c;然后讀取下一行&#xf…

彭濤 | 2024年5月小結

5月份還是蠻有刺激的&#xff0c;做了蠻多的事情&#xff0c;但是沒賺到錢&#xff0c;真是一屯操作猛如虎&#xff0c;一看賬戶0.5。 就喜歡創業這種一天天累死累活還不賺錢的感覺&#xff0c;哈哈哈哈 老規矩簡單說下這個月的情況&#xff0c;如果對你有收獲就最好了。 游學丹…

測繪外業需要注意些什么?

在進行測繪外業時&#xff0c;需要注意的事項涉及多個方面&#xff0c;包括充分的準備工作、合理的設備選擇、精確的操作技巧以及細致的數據處理。下面將具體展開這些要點&#xff1a; 1. 充分準備 - 了解任務要求&#xff1a;在開始外業工作前&#xff0c;需要明確測繪的目…

VUE框架前置知識總結

一、前言 在學習vue框架中&#xff0c;總是有些知識不是很熟悉&#xff0c;又不想系統的學習JS&#xff0c;因為學習成本太大了&#xff0c;所以用到什么知識就學習什么知識。此文檔就用于記錄零散的知識點。主要是還是針對與ES6規范的JS知識點。 以下實驗環境都是在windows環…

頭歌頁面置換算法第2關:計算OPT算法缺頁率

2 任務:OPT算法 2.1 任務描述 設計OPT頁面置換算法模擬程序:從鍵盤輸入訪問串。計算OPT算法在不同內存頁框數時的缺頁數和缺頁率。要求程序模擬駐留集變化過程,即能模擬頁框裝入與釋放過程。 2.2任務要求 輸入串長度作為總頁框數目,補充程序完成OPT算法。 2.3算法思路 OPT算…

【Tlias智能學習輔助系統】04 部門管理 刪除 和 新增

Tlias智能學習輔助系統 04 部門管理 刪除 和 新增 刪除部門APIDeptController.javaDeptService.javaDeptServiceImpl.javaDeptMapper.java前端聯調 新增部門API有一步簡化DeptController.javaDeptService.javaDeptServiceImpl.javaDeptMapper.java前端聯調 刪除部門API 請求路徑…

31-ESP32-S3-WIFI篇-02 Event Group (事件標記組)

ESP32-S3-WIFI 事件標記組 介紹 在ESP32-S3的WiFi驅動程序中&#xff0c;事件標記組&#xff08;Event Group&#xff09;是一個非常重要的概念。它是FreeRTOS中的一種同步機制&#xff0c;用于在任務之間傳遞和同步事件。在WiFi驅動程序中&#xff0c;我們使用事件標記組來通…

Go 語言字符串及 strings 和 strconv 包

在 Go 語言編程中&#xff0c;字符串是最基本、最常用的數據類型之一。無論是處理用戶輸入、讀取文件內容&#xff0c;還是生成輸出&#xff0c;字符串操作無處不在。為了方便開發者對字符串進行各種操作&#xff0c;Go 語言提供了強大的 strings 包和 strconv 包。strings 包包…

Selenium+Java 環境搭建

selenium 介紹 Selenium 是 web 應用中基于 UI 的自動化測試框架&#xff0c;支持多平臺、多瀏覽器、多語言。 早期的 selenium RC 已經被現在的 webDriver 所替代&#xff0c;可以簡單的理解為selenium1.0webdriver 構成 現在的 Selenium2.0 。現在我們說起 selenium &#xf…

適合學生寫作業的臺燈有哪些?臺燈怎么選詳細攻略!

在數字化飛速發展的今天&#xff0c;孩子們的學習和生活越來越離不開電子屏幕。然而&#xff0c;長時間盯著屏幕&#xff0c;不僅容易讓眼睛感到疲勞&#xff0c;更是近視問題日益嚴重的元兇之一。每一位家長都希望孩子能擁有健康的視力&#xff0c;因此會為孩子挑選一臺護眼燈…

MySQL十部曲之九:MySQL優化理論

文章目錄 前言概述查詢優化查詢執行計劃EXPLAIN獲取表結構信息獲取執行計劃信息 EXPLAIN 輸出格式如何使用EXPLAIN進行優化 范圍訪問優化單列索引的范圍訪問多列索引的范圍訪問 索引合并優化索引合并交叉訪問算法索引合并聯合訪問算法索引合并排序聯合訪問算法 索引下推優化連接…

豆包瀏覽器插件會造成code標簽內容無法正常顯示

啟用狀態&#xff1a;頁面的代碼會顯示不正常 禁用后&#xff0c;正常顯示 害得我重置瀏覽器設置&#xff0c;一個個測試