JS數(shù)組扁平化的方法合集(遞歸,while循環(huán),flat)
前言
數(shù)組扁平化也是面試??碱}之一,今天就和大家簡單分享一下常見的數(shù)組扁平方法。這題其實主要考察的是遞歸思想,因為當數(shù)組里面嵌套非常多層數(shù)組的時候只能通過循環(huán)遞歸來進行扁平。本次分享主要也是分享本題的遞歸思想。話不多說,開始分享!
flat() 方法
第一個方法那必須是js自帶的方法,flat
是 JavaScript 中 Array 對象的一個方法,它用于將多維數(shù)組扁平化,即把一個嵌套多層的數(shù)組轉換為只有一層的數(shù)組。這個方法是在 ECMAScript 2019 (ES10) 中引入的。flat
方法可以接受一個可選的參數(shù) depth
,用來指定扁平化的深度。
- 不傳參數(shù)或傳
1
時,默認扁平化第一層嵌套數(shù)組。 - 傳入數(shù)字
n
表示將數(shù)組扁平化到第n
層深度。 - 如果傳入
Infinity
作為參數(shù),那么不管嵌套多深,都會被扁平化為一維數(shù)組。
下面是一些示例
let arr = [1,[2,[3,[4,5]]]]; // 只會扁平化一層 console.log(arr.flat(1));//[1,2,[3,[4,5]]] // 扁平化兩層 console.log(arr.flat(2));//[1,2,3,[4,5]] // 全部扁平化 console.log(arr.flat(Infinity));//[1,2,3,4,5]
toString()方法
一個冷知識,數(shù)組的toString
方法會把元素以逗號分隔,意思是無論你嵌套多少層,toString
方法都能給你變成逗號分隔,剛好滿足我們的要求扁平數(shù)組。
let arr = [1,[2,[3,[4,5]]]]; //toString方法變成字符串 console.log(arr.toString());//'1,2,3,4,5' arr = arr.toString().split(",").map(function (item){ return +item; })
遞歸
這里簡單介紹一下思路,當你遇到一個并不知到范圍的數(shù)據(jù)(不知道嵌套了多少層的數(shù)組),只能使用循環(huán)或者是遞歸來進行所有范圍的遍歷,其中雖然遞歸相對循環(huán)性能較差因為要不斷創(chuàng)建上下文入執(zhí)行棧。但是不得不說遞歸真是太酷啦!
純手寫遞歸
let arr = [1,[2,[3,[4,5]]]]; function flatten(arr) { //創(chuàng)建一個數(shù)組,接受扁平化的數(shù)組 let result = []; for(let i=0,len=arr.length;i<len;i++){ // 如果子元素是數(shù)組 if(Array.isArray(arr[i])){ // 將 子元素扁平之后加入到結果數(shù)組里面 result = result.concat(flatten(arr[i])); }else{ // 子元素不是數(shù)組就直接添加 result.push(arr[i]); } } return result; } console.log(flatten(arr));//[1,2,3,4,5]
reduce方法進行遞歸(代碼較少)
這里怕有些小伙伴不知道reduce
的用法這里簡單介紹一下。 reduce
函數(shù)會遍歷每一個元素,每次遍歷都會執(zhí)行一個回調函數(shù),該函數(shù)有兩個參數(shù),一個是上一次回調函數(shù)返回的值,還有一個參數(shù)就是當前元素的值??梢越o初始值,不給的話就默認初始值為第一個元素,然后從第二個元素開始遍歷。最后返回最后一次回調函數(shù)返回的值。下面是reduce的簡單案例
let arr = [1,2]; console.log(arr.reduce((sum,nowVal)=>sum+nowVal))// 3 console.log(arr.reduce((sum,nowVal)=>sum+nowVal,4))// 4
簡單了解reduce之后我們就來開始遞歸扁平數(shù)組
let arr = [1,[2,[3,[4,5]]]]; function flatten(arr){ // 和普通遞歸相同,這里只不過是縮減了代碼,思想一致 return arr.reduce((result,nowValue)=> Array.isArray(nowValue)?result.concat(flatten(nowValue)):result.concat(nowValue),[]); } console.log(flatten(arr));// [1,2,3,4,5]
while循環(huán)
雖然遞歸真的很好用,但是還是要介紹一下循環(huán)。本文運用到了數(shù)組的結構方法,JavaScript中的解構是一種允許您從數(shù)組或對象中提取數(shù)據(jù)并將其分配給變量的表達式。這種特性是ES6(ECMAScript 2015)引入的,極大地提高了代碼的簡潔性和可讀性。 這里也是簡單舉個例子:
let arr = [1,2,3,[4,5]]; let [first,...rest]=arr;//first就是1,這里的rest就會存儲剩下的元素[2,3,[4,5]]
那么接下來就是數(shù)組扁平啦!
let arr = [1,[2,[3,[4,5]]]]; function flatten(arr){ let result = []; while(arr.length!=0){ // 將arr的第一個元素取出,剩下的存入rest數(shù)組中 let [first,...rest] = arr; if(Array.isArray(first)){ //如果是數(shù)組,那么就將first進行解構將里面的元素逐一添加到arr中, //相當于將first里面的元素降了一個層級,rest必須進行解構添加 // 否則將會將rest里面的元素層級提升 arr = [...first,...rest]; }else{ //如果第一個元素不是數(shù)組,就添加到結果數(shù)組中 result.push(first); //這里相當與將第一個元素剔除,下次遍歷取rest數(shù)組第一個元素 arr =[...rest]; } } return result; } console.log(flatten(arr));// [1,2,3,4,5]
結語
到此這篇關于JS數(shù)組扁平化的方法合集(遞歸,while循環(huán),flat)的文章就介紹到這了,更多相關JS數(shù)組扁平化內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
JavaScript日期時間與時間戳的轉換函數(shù)分享
這篇文章主要介紹了JavaScript日期時間與時間戳的轉換函數(shù)分享,本文給出兩個函數(shù)實現(xiàn)日期時間和時間戳間的轉換,需要的朋友可以參考下2015-01-01