JS實(shí)現(xiàn)數(shù)組扁平化的方法分享
前言
當(dāng)我們遇到一個(gè) 樹形結(jié)構(gòu)
的數(shù)據(jù),或者 多層嵌套
的數(shù)組,如果想拿到數(shù)組項(xiàng)的 某一個(gè)
字段值,操作起來將會很麻煩,這個(gè)時(shí)候就需要我們將數(shù)組 扁平化
之后,通過 map
方法直接就可以拿到。
過程
什么是扁平化
數(shù)組扁平化指的是:將一個(gè)多層嵌套的數(shù)組,處理成只有一層的數(shù)組,如下代碼:
const arr = [ { id:1,title:"文章管理",children:[ { id:2,title:"文章列表",children:[ { id:3,title:"文章新增" }, { id:4,title:"文章刪除" }, ] } ] } ] // 轉(zhuǎn)換之后 [ { id:1,title:"文章管理" }, { id:2,title:"文章列表" }, { id:3,title:"文章新增" }, { id:4,title:"文章刪除" }, ]
通過上面的結(jié)果我們就可以很方便地拿出所有的 id
。
方法一:flat
flat
:這是ES6
中Array
對象新增的一個(gè)方法,可以很方便的把多維數(shù)組轉(zhuǎn)換為一維數(shù)組。MDN文檔參考此處。
flat
方法的參數(shù)是深度,默認(rèn)是 1
,表示展開幾層。
假設(shè)我們是 三維數(shù)組 ,那展開的深度就應(yīng)該是 3-1
。
這樣做確實(shí)有些麻煩,JavaScript
也貼心地為我們提供了 Infinity
,可在此處查看介紹。
所以我們可以將 arr.flat(2)
修改為 arr.flat(Infinity)
。
但是使用 flat
存在個(gè) 弊端 ,當(dāng)我們 數(shù)組項(xiàng) 是 對象,且 無限下鉆 時(shí),就不能很好的幫我們展開了,這個(gè)時(shí)候就引入第二種方法。
方法二:遞歸
遞歸:是一種 算法,表示在一個(gè) 函數(shù) 內(nèi) return自身 ,當(dāng)滿足 指定條件 時(shí) return值 跳出循環(huán)。
這里我們定義一個(gè)遞歸方法 flatArr
,方法接收源數(shù)組 data
和 子集key childField
:
function flatArr(data = [],childField = ""){}
定義一個(gè)結(jié)果集 result
,并最終返回:
function flatArr(data = [],childField = ""){ const result = []; return result; }
接下來定義一個(gè)遞歸方法 deepFn
,接收一個(gè)數(shù)組參數(shù) arr
,并循環(huán) arr
執(zhí)行遞歸,將循環(huán)出來的每一項(xiàng)push
給 result
,并調(diào)用這個(gè)遞歸方法 :
function flatArr(data = [],childField = ""){ const result = []; const deepFn = (arr) => { arr.forEach(e => { if(e[childField] && e[childField].length > 0 ){ deepFn(e[childField]) }else{ result.push(e) } }) } deepFn(data); return result; }
至此,這個(gè)遞歸方法就這樣實(shí)現(xiàn)了,接下來我們測試一下:
好嘞,確實(shí)沒什么問題,大功告成!
到此這篇關(guān)于JS實(shí)現(xiàn)數(shù)組扁平化的方法分享的文章就介紹到這了,更多相關(guān)JS數(shù)組扁平化內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
js實(shí)現(xiàn)簡單的點(diǎn)名器隨機(jī)色實(shí)例代碼
這篇文章主要給大家介紹了關(guān)于js實(shí)現(xiàn)簡單的點(diǎn)名器隨機(jī)色的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09JS實(shí)現(xiàn)頁面進(jìn)入和返回定位到具體位置
其實(shí)瀏覽器也自帶了返回的功能,也就是說,自帶了返回定位的功能,返回定位到具體位置有兩種方法,下面通過場景分析給大家詳細(xì)講解,需要的的朋友參考下2016-12-12微信小程序填寫用戶頭像和昵稱實(shí)現(xiàn)方法淺析
這篇文章主要介紹了微信小程序填寫用戶頭像和昵稱實(shí)現(xiàn)方法,我們使用小程序往往能碰到提示允許獲取用戶頭像昵稱,這種功能怎么實(shí)現(xiàn)呢?本篇文章帶你探索2023-02-02Javascript表格翻頁效果實(shí)現(xiàn)思路及代碼
表格翻頁的實(shí)現(xiàn)方式有很多,下面以js為例為大家詳細(xì)介紹下表格翻頁效果的具體實(shí)現(xiàn),感興趣的朋友可以參考下2013-08-08postMessage消息通信Promise化的方法實(shí)現(xiàn)
postMessage Api 想必大家都不陌生,WebWorker 通信會用到,iframe 窗口之間通信也會用到,那么我們能不能將 postMessage 進(jìn)行一次轉(zhuǎn)化,把他變成類似 Promise 的使用方式,所以本文給大家介紹了postMessage消息通信Promise化的方法實(shí)現(xiàn),需要的朋友可以參考下2024-03-03JavaScript高階函數(shù)_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要介紹了JavaScript高階函數(shù),詳細(xì)講解了什么是高階函數(shù)和高階函數(shù)的用法,有興趣的可以了解下2017-06-06基于JavaScript實(shí)現(xiàn)帶縮略圖的輪播效果
這篇文章主要為大家詳細(xì)介紹了基于JavaScript實(shí)現(xiàn)帶縮略圖的輪播效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-01-01