面試官:【js多維數組扁平化去重并排序】

文章目錄

  • 前言
  • 方法一
  • 方法二
  • 方法三
  • 方法四
  • 總結
  • 后言

前言

hello world歡迎來到前端的新世界


😜當前文章系列專欄:JavaScript
🐱?👓博主在前端領域還有很多知識和技術需要掌握,正在不斷努力填補技術短板。(如果出現錯誤,感謝大家指出)🌹
💖感謝大家支持!您的觀看就是作者創作的動力

方法一

使用遞歸方法扁平化——性能較差

function flatten(arr) {return arr.reduce((acc, val) => Array.isArray(val) ? acc.concat(flatten(val)) : acc.concat(val), []);
}let multiArr = [1, 2, [3, 4, [5, 6], 7], [8, 9]];
let flatArr = flatten(multiArr);let uniqueArr = [...new Set(flatArr)];let sortedArr = uniqueArr.sort((a, b) => {return a - b});console.log(sortedArr);

這種方法使用了遞歸來扁平化整個數組,可以處理任意多層的嵌套數組。但是,對于非常大的多維數組,遞歸方法的性能會很差。


方法二

使用ES6的擴展運算符扁平化——性能較差

let multiArr = [1, 2, [3, 4, [5, 6], 7], [8, 9]];
let flatArr = [].concat(...multiArr);let uniqueArr = [...new Set(flatArr)];let sortedArr = uniqueArr.sort((a, b) => {return a - b});console.log(sortedArr);

這種方法使用了ES6的擴展運算符將多維數組扁平化為一維數組,然后使用Set進行去重。但是,它仍然需要創建一個新的數組,因此對于非常大的多維數組,它的性能也不是很好。


方法三

使用reduce方法扁平化——性能較好

let multiArr = [1, 2, [3, 4, [5, 6], 7], [8, 9]];
let flatArr = multiArr.reduce((acc, val) => {return acc.concat(Array.isArray(val) ? val.flat() : val);
}, []);let uniqueArr = [...new Set(flatArr)];let sortedArr = uniqueArr.sort((a, b) => {return a - b});console.log(sortedArr);

這種方法使用了reduce方法對多層嵌套的數組進行扁平化。由于使用了原生的Array.prototype.flat方法,因此它的性能相對較快。但是,需要注意的是flat方法可能無法在所有環境下使用。


方法四

使用迭代方法扁平化——性能最佳

let multiArr = [1, 2, [3, 4, [5, 6], 7], [8, 9]];
let queue = [...multiArr];
let flatArr = [];while(queue.length > 0) {let node = queue.shift();if(Array.isArray(node)) {queue.unshift(...node);} else if(node !== undefined) {flatArr.push(node);}
}let uniqueArr = [...new Set(flatArr)];let sortedArr = uniqueArr.sort((a, b) => {return a - b});console.log(sortedArr);

這種方法使用了迭代方法扁平化數組,沒有使用任何遞歸,也不需要重新分配內存。這使得它在處理大型多維數組時具有更好的性能。


總結

最優解決方案是使用迭代方法扁平化,因為它具有最好的性能,并且不會產生與內存分配相關的問題。但是,如果您需要兼容一些老的瀏覽器或運行時環境,您可以使用reduce方法扁平化。如果您不需要考慮性能問題,那么遞歸方法和擴展運算符也是可行的選項。

后言

創作不易,要是本文章對廣大讀者有那么一點點幫助 不妨三連支持一下,您的鼓勵就是博主創作的動力

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

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

相關文章

【騰訊云云上實驗室-向量數據庫】Tencent Cloud VectorDB在實戰項目中替換Milvus測試

為什么嘗試使用Tencent Cloud VectorDB替換Milvus向量庫? 亮點:Tencent Cloud VectorDB支持Embedding,免去自己搭建模型的負擔(搭建一個生產環境的模型實在耗費精力和體力)。 騰訊云向量數據庫是什么? 騰…

rsync配置和守護進程實踐

目錄 一、rsync概念 1.rsync簡介 2.rsync特點 3、增量和全局傳輸 二、Rsync工作方式 1.準備好rsync備份服務器 2.本地的數據傳輸模式 3.遠程的數據傳輸模式 4.rsync數據推拉模式 三、實踐 1.準備三臺虛擬機 2.都安裝rsync服務 3.拉取遠程文件 3.推送文件 4.rsyn…

Oracle用戶(User)和表空間(Tablespace)

3. 用戶和表空間 3.1. 用戶 1)概念 Oracle數據庫中,用戶(User)是訪問數據庫的途徑和認證方式,同時,用戶也是數據庫對象的邏輯集合。我們通過數據庫用戶和密碼來登錄數據庫,然后,可以在該用戶下創建和操作數據庫對象。 2)創建和配置 創建Oracle用戶,需要具備創建…

python系統編程

文章目錄 系統編程系統工具概述sys模塊os模塊 腳本運行上下文當前工作路徑命令行參數shell環境變量標準流 文件和目錄工具文件工具目錄工具 并行系統工具進程分支線程 系統編程 系統工具 概述 python系統模塊: 模塊名作用*sys負責導出與怕以后呢解釋器本身相關的組件*os包含…

Django DRF序列化器serializer

以下案例由淺到深&#xff0c;逐步深入&#xff0c;通過實例介紹了序列化器的使用方法&#xff0c;和其中遇到的常見問題的解決。 一、序列化器serializers.Serializer 1、urls.py urlpatterns [path("api/<str:version>/depart/",views.DepartView.as_vie…

緩存雪崩、擊穿、穿透及解決方案_保證緩存和數據庫一致性

文章目錄 緩存雪崩、擊穿、穿透1.緩存雪崩造成緩存雪崩解決緩存雪崩 2. 緩存擊穿造成緩存擊穿解決緩存擊穿 3.緩存穿透造成緩存穿透解決緩存穿透 更新數據時&#xff0c;如何保證數據庫和緩存的一致性&#xff1f;1. 先更新數據庫&#xff1f;先更新緩存&#xff1f;解決方案 2…

【問題解決】RuntimeError: apex.optimizers.FusedSGD requires cuda extension 問題解決

在使用 apex 庫時&#xff0c;按照官方的方式安裝后&#xff0c;雖然安裝成功&#xff0c;但調用的時候會報錯如下&#xff0c;也就是說其實沒有成功安裝可調用 cuda 的 apex&#xff1a; RuntimeError: apex.optimizers.FusedSGD requires cuda extension我找了很多解決方式&…

【藍橋杯省賽真題46】Scratch魔術表演 藍橋杯scratch圖形化編程 中小學生藍橋杯省賽真題講解

目錄 scratch魔術表演 一、題目要求 編程實現 二、案例分析 1、角色分析

微信小程序bindtap和catchtap的區別?

子元素用bindtap綁定事件后&#xff0c;執行的時候&#xff0c;會冒泡到父元素&#xff08;觸發父親元素上綁定的bindtap事件&#xff09; 如果不想冒泡到父元素&#xff0c;可以用catchtap代替 bindtap事件綁定不會阻止冒泡事件向上冒泡 catchtap事件綁定可以阻止冒泡事件向上…

centos 7.7 安裝Python-3.7.4

一、安裝PYTHON 編譯依賴包 1.1 首先安裝gcc編譯器&#xff0c;gcc有些系統版本已經默認安裝&#xff0c;通過 gcc --version 查看&#xff0c;沒安裝的先安裝gcc&#xff0c; yum -y install gcc glibc make1.2 安裝其它依賴包&#xff0c;&#xff08;注&#xff1a;不要缺…

【雙指針】和為 s 的兩個數字

和為 s 的兩個數字 文章目錄 和為 s 的兩個數字題目描述算法思路暴力枚舉雙指針 代碼編寫Java代碼C代碼編寫 LCR 179. 查找總價格為目標值的兩個商品 - 力扣&#xff08;LeetCode&#xff09; 題目描述 購物車內的商品價格按照升序記錄于數組 price。請在購物車中找到兩個商品…

Android修行手冊-超出父布局進行顯示以及超出父布局實現點擊

Unity3D特效百例案例項目實戰源碼Android-Unity實戰問題匯總游戲腳本-輔助自動化Android控件全解手冊再戰Android系列Scratch編程案例軟考全系列Unity3D學習專欄藍橋系列ChatGPT和AIGC &#x1f449;關于作者 專注于Android/Unity和各種游戲開發技巧&#xff0c;以及各種資源分…

shopee數據分析軟件丨探索Shopee數據分析軟件——知蝦

隨著電子商務的快速發展&#xff0c;越來越多的商家和企業開始關注數據分析的重要性。在這個競爭激烈的市場中&#xff0c;了解消費者行為、市場趨勢和競爭對手的策略是取得成功的關鍵。而Shopee數據分析軟件——知蝦&#xff0c;成為了許多商家和企業的首選工具。本文將深入探…

ubuntu20.04 nginx 部署靜態網頁

1、安裝nginx Ubuntu環境下安裝部署Nginx&#xff08;有網&#xff09;_ubuntu 安裝nginx_荒Huang的博客-CSDN博客 2、壓縮并上傳文件到服務器指定位置(unzip命令)&#xff0c;修改nginx配置文件&#xff0c;指定root目錄為文件的目錄&#xff0c;index 值為指定的html文件 …

【拿完年終獎后】想要轉行網絡安全,一定不要錯過這個時間段。

網絡安全&#xff0c;作為當下互聯網行業中較為熱門的崗位&#xff0c;薪資可觀、人才需求量大&#xff0c;作為轉行必考慮。 在這里奉勸所有零基礎想轉行&#xff08;入門&#xff09; 網絡安全的朋友們 在轉行之前&#xff0c;一定要對網絡安全行業做一個大概了解&#xf…

latex通過bib添加參考文獻作者名字有特殊符號如字母上有兩點亂碼解決辦法

一、背景 在使用latex寫英文論文時&#xff0c;一般是通過bib的方式添加參考文獻。但有的參考文獻作者是法國人或其他國家的&#xff0c;名字會有特殊符號&#xff0c;如某個字母上有兩個點&#xff0c;或者聲調符號等等&#xff0c;如下圖所示&#xff1a; 如果不進行特殊操作…

【C++初階】第一站:C++入門基礎(中)

前言&#xff1a; 這篇文章是c入門基礎的第一站的中篇,涉及的知識點 函數重載:函數重載的原理--名字修飾 引用:概念、特性、使用場景、常引用、傳值、傳引用效率比較的知識點 目錄 5. 函數重載 &#xff08;續&#xff09; C支持函數重載的原理--名字修飾(name Mangling) 為什么…

ACE前攝器Proactor

轉載的&#xff0c;已經找不到原文地址了 Proactor是異步模式的網絡處理器&#xff0c;ACE中叫做“前攝器”。 先講幾個概念&#xff1a; 前攝器&#xff08;Proactor&#xff09;&#xff0d;異步的事件多路分離器、處理器&#xff0c;是核心處理類。啟動后由3個線程…

csv文件添加文件內容和讀取

append content to file import numpy as np acc_listnp.array([0.97,0.92,0.93,0.89]) # 注意這個地方添加文件不需要特別聲明是什么文件 file open("result.csv", "a") print("{:.2f}, {:.2f}".format(acc_list.mean(), acc_list.std()), f…

【JavaEE】Spring小練習——存儲和獲取對象

一、題目&#xff1a; 在 Spring 項目中&#xff0c;通過 main 方法獲取到 Controller 類&#xff0c;調用 Controller 里面通過注入的方式調用Service 類&#xff0c;Service 再通過注入的方式獲取到 Repository 類&#xff0c;Repository 類里面有一個方法構建?個 User 對象…