最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JS數(shù)組扁平化的方法合集(遞歸,while循環(huán),flat)

 更新時間:2024年06月25日 08:24:47   作者:星辰中的維納斯  
數(shù)組扁平化也是面試常考題之一,今天就和大家簡單分享一下常見的數(shù)組扁平方法,這題其實(shí)主要考察的是遞歸思想,因?yàn)楫?dāng)數(shù)組里面嵌套非常多層數(shù)組的時候只能通過循環(huán)遞歸來進(jìn)行扁平,本次分享主要也是分享本題的遞歸思想,需要的朋友可以參考下

前言

數(shù)組扁平化也是面試??碱}之一,今天就和大家簡單分享一下常見的數(shù)組扁平方法。這題其實(shí)主要考察的是遞歸思想,因?yàn)楫?dāng)數(shù)組里面嵌套非常多層數(shù)組的時候只能通過循環(huán)遞歸來進(jìn)行扁平。本次分享主要也是分享本題的遞歸思想。話不多說,開始分享!

flat() 方法

第一個方法那必須是js自帶的方法,flat 是 JavaScript 中 Array 對象的一個方法,它用于將多維數(shù)組扁平化,即把一個嵌套多層的數(shù)組轉(zhuǎn)換為只有一層的數(shù)組。這個方法是在 ECMAScript 2019 (ES10) 中引入的。
flat 方法可以接受一個可選的參數(shù) depth,用來指定扁平化的深度。

  • 不傳參數(shù)或傳 1 時,默認(rèn)扁平化第一層嵌套數(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;
})

遞歸

這里簡單介紹一下思路,當(dāng)你遇到一個并不知到范圍的數(shù)據(jù)(不知道嵌套了多少層的數(shù)組),只能使用循環(huán)或者是遞歸來進(jìn)行所有范圍的遍歷,其中雖然遞歸相對循環(huán)性能較差因?yàn)橐粩?strong>創(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])){
        // 將 子元素扁平之后加入到結(jié)果數(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方法進(jìn)行遞歸(代碼較少)

這里怕有些小伙伴不知道reduce的用法這里簡單介紹一下。 reduce函數(shù)會遍歷每一個元素,每次遍歷都會執(zhí)行一個回調(diào)函數(shù),該函數(shù)有兩個參數(shù),一個是上一次回調(diào)函數(shù)返回的值,還有一個參數(shù)就是當(dāng)前元素的值。可以給初始值,不給的話就默認(rèn)初始值為第一個元素,然后從第二個元素開始遍歷。最后返回最后一次回調(dià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)。本文運(yùn)用到了數(shù)組的結(jié)構(gòu)方法,JavaScript中的解構(gòu)是一種允許您從數(shù)組或?qū)ο笾刑崛?shù)據(jù)并將其分配給變量的表達(dá)式。這種特性是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進(jìn)行解構(gòu)將里面的元素逐一添加到arr中,
        //相當(dāng)于將first里面的元素降了一個層級,rest必須進(jìn)行解構(gòu)添加
        // 否則將會將rest里面的元素層級提升
        arr = [...first,...rest];
        }else{
        //如果第一個元素不是數(shù)組,就添加到結(jié)果數(shù)組中
        result.push(first);
        //這里相當(dāng)與將第一個元素剔除,下次遍歷取rest數(shù)組第一個元素
        arr =[...rest];
        }
    }
    return result;
}
console.log(flatten(arr));// [1,2,3,4,5]

結(jié)語

到此這篇關(guān)于JS數(shù)組扁平化的方法合集(遞歸,while循環(huán),flat)的文章就介紹到這了,更多相關(guān)JS數(shù)組扁平化內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 利用JS實(shí)現(xiàn)瀏覽器的title閃爍

    利用JS實(shí)現(xiàn)瀏覽器的title閃爍

    經(jīng)??梢钥匆姷膖itle里面的消息提示,下面是JS的一種實(shí)現(xiàn)方法,需要的朋友可以參考下
    2013-07-07
  • JavaScript判斷數(shù)組的方法總結(jié)與推薦

    JavaScript判斷數(shù)組的方法總結(jié)與推薦

    這篇文章主要給大家介紹了關(guān)于JavaScript判斷數(shù)組方法的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2022-02-02
  • JS區(qū)分Object與Aarry的六種方法總結(jié)

    JS區(qū)分Object與Aarry的六種方法總結(jié)

    下面小編就為大家?guī)硪黄狫S區(qū)分Object與Aarry的六種方法總結(jié)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-02-02
  • javascript中this的四種用法

    javascript中this的四種用法

    在javascript當(dāng)中每一個function都是一個對象,所以在這個里var temp=this 指的是function當(dāng)前的對象。this是Javascript語言的一個關(guān)鍵字。它代表函數(shù)運(yùn)行時,自動生成的一個內(nèi)部對象,只能在函數(shù)內(nèi)部使用。
    2015-05-05
  • JavaScript版DateAdd和DateDiff函數(shù)代碼

    JavaScript版DateAdd和DateDiff函數(shù)代碼

    VBScript中有兩個非常好用的日期操作函數(shù):DateAdd用來給日期添加指定時間間隔,DateDiff用來返回兩個日期的時間間隔??上У氖荍avaScript沒有,不過我們可以寫一個函數(shù)來實(shí)現(xiàn),一樣的,呵呵
    2012-03-03
  • javascript的動態(tài)加載、緩存、更新以及復(fù)用(一)

    javascript的動態(tài)加載、緩存、更新以及復(fù)用(一)

    在做OA、MIS、ERP等信息管理類的項目,經(jīng)常會遇到引用很多js文件,這就需要用到動態(tài)加載、緩存、更新以及復(fù)用等技術(shù),下面我們來討論下
    2014-06-06
  • 使用apifm-wxapi快速開發(fā)小程序過程詳解

    使用apifm-wxapi快速開發(fā)小程序過程詳解

    這篇文章主要介紹了使用apifm-wxapi快速開發(fā)小程序過程詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-08-08
  • layer實(shí)現(xiàn)登錄彈框,登錄成功后關(guān)閉彈框并調(diào)用父窗口的例子

    layer實(shí)現(xiàn)登錄彈框,登錄成功后關(guān)閉彈框并調(diào)用父窗口的例子

    今天小編就為大家分享一篇layer實(shí)現(xiàn)登錄彈框,登錄成功后關(guān)閉彈框并調(diào)用父窗口的例子,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-09-09
  • 基于JavaScript構(gòu)建一個動態(tài)博客應(yīng)用

    基于JavaScript構(gòu)建一個動態(tài)博客應(yīng)用

    這篇文章主要為大家詳細(xì)介紹了如何基于JavaScript構(gòu)建一個動態(tài)博客應(yīng)用,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-02-02
  • 微信小程序scroll-view橫向滑動嵌套for循環(huán)的示例代碼

    微信小程序scroll-view橫向滑動嵌套for循環(huán)的示例代碼

    這篇文章主要介紹了微信小程序scroll-view橫向滑動嵌套for循環(huán)的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-09-09

最新評論

祥云县| 达尔| 汕头市| 胶州市| 恩平市| 贵州省| 天长市| 海城市| 务川| 新密市| 彭阳县| 岳西县| 大邑县| 平湖市| 汶上县| 米泉市| 五指山市| 衡阳县| 桐柏县| 濉溪县| 资中县| 嘉鱼县| 利辛县| 黔西县| 阜新市| 昌邑市| 印江| 张北县| 勐海县| 祁连县| 宝丰县| 扶余县| 舒城县| 防城港市| 巴彦淖尔市| 龙川县| 彩票| 茌平县| 哈巴河县| 宁远县| 赞皇县|