成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

對象扁平化

Aomine / 1204人閱讀

摘要:引言中午起來有個人問了我一個題,怎么實現(xiàn)對象扁平化,如圖仔細一看這不就是層次遍歷么,又仔細一看,我好像還沒研究過如何寫數(shù)據(jù)結(jié)構(gòu),作罷,花了兩小時暴力解決思路本來想的是對象或者數(shù)組,對象有個好處,可以標(biāo)識是第幾層,但是數(shù)組操作比較方便,有的方

引言

中午起來有個人問了我一個題,怎么實現(xiàn)對象扁平化,如圖

仔細一看這不就是層次遍歷么,又仔細一看,我好像還沒研究過js如何寫數(shù)據(jù)結(jié)構(gòu),作罷,花了兩小時暴力解決

思路

本來想的是對象或者數(shù)組,對象有個好處,可以標(biāo)識是第幾層,但是數(shù)組操作比較方便,有l(wèi)odash的方法可以直接扁平化,就偷了個懶,但是一下實現(xiàn)方法對象和數(shù)組通用,都可以輸出正確的結(jié)果

代碼
var _ = require("lodash");

var obj = {
   a: {
       b: {
           c: {f: "aa"}
       },
       d: {
           e: {g: "bb"},
           h: {i: "cc"}
       },
       j: {
           k: "dd"
       }
   } 
};//f,g,i,c,e,h,k,b,d,j,a

const arrayIncludes = (arr, a) => arr.toString().includes(a.toString()) ;

const sear = (obj, deep, arr) => {
    for(let key in obj) {
        !arr[deep] && (arr[deep] = []);
        var keys = Object.keys(obj);
        !arrayIncludes(arr[deep], keys) && arr[deep].push(Object.keys(obj));
        if(typeof obj[key] === "object") {
            sear(obj[key], deep+1,arr);
        }
    }
    return arr;
}

console.log(sear(obj, 0, {}))
var res = _.flattenDeep(sear(obj, 0, []).reverse());
console.log(res);

結(jié)果如下:

$ node 對象扁平化.js
{ "0": [ [ "a" ] ],
  "1": [ [ "b", "d", "j" ] ],
  "2": [ [ "c" ], [ "e", "h" ], [ "k" ] ],
  "3": [ [ "f" ], [ "g" ], [ "i" ] ] }
[ "f", "g", "i", "c", "e", "h", "k", "b", "d", "j", "a" ]

分別是對象方式和數(shù)組方式的結(jié)果

難點

遇到了二維數(shù)組的問題,我的方式是在push每個數(shù)組之前都檢查一遍存在不存在,有人給的建議是先得到完整的數(shù)組再去重,因為我采取的是多維數(shù)組,考慮到多維數(shù)組去重也許效率了不高?沒有仔細研究,問題描述和解決如下
[[[1,2,3],[1,2,3]].includes([1,2,3])返回false](https://segmentfault.com/q/10...

9.30更新

中午起來小伙伴給我發(fā)了個改進版的,不用去重,我覺得比我原來的好很多,分享一下

const sear = (obj, deep, arr) => {
    !arr[deep] ? (arr[deep] = Object.keys(obj) ) : (arr[deep] = arr[deep].concat(Object.keys(obj)));
    for(let key in obj) {
        if(typeof obj[key] === "object") {
            sear(obj[key], deep+1,arr);
        }
    }
    return arr;
}

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/80562.html

相關(guān)文章

  • 前端數(shù)據(jù)平化與持久化

    摘要:與持久化工程師花了年時間打造,與同期出現(xiàn)。有持久化數(shù)據(jù)結(jié)構(gòu),如等,并發(fā)安全??偨Y(jié)篇幅有限,時間也比較晚了,關(guān)于前端數(shù)據(jù)的扁平化與持久化處理先講這么多了,有興趣的同學(xué)可以關(guān)注下,后面有時間會多整理分享。 (PS: 時間就像海綿里的水,擠到?jīng)]法擠,只能擠擠睡眠時間了~ 知識點還是需要整理的,付出總會有收獲,tired but fulfilled~) 前言 最近業(yè)務(wù)開發(fā),從零搭建網(wǎng)頁生成器,...

    dreamtecher 評論0 收藏0
  • 各類型的 toString 方法合集

    摘要:對象覆蓋了的方法方法連接數(shù)組并返回一個字符串,其中包含用逗號分隔的每個數(shù)組元素運用這個方法,可以處理數(shù)組扁平化不過有一些限制。 toString() Object.prototype.toString() Array.prototype.toString() Boolean.prototype.toString() RegExp.prototype.toString() String....

    geekidentity 評論0 收藏0
  • JavaScript專題之?dāng)?shù)組平化

    摘要:專題系列第九篇,講解如何實現(xiàn)數(shù)組的扁平化,并解析的源碼扁平化數(shù)組的扁平化,就是將一個嵌套多層的數(shù)組嵌套可以是任何層數(shù)轉(zhuǎn)換為只有一層的數(shù)組。 JavaScript 專題系列第九篇,講解如何實現(xiàn)數(shù)組的扁平化,并解析 underscore 的 _.flatten 源碼 扁平化 數(shù)組的扁平化,就是將一個嵌套多層的數(shù)組 array (嵌套可以是任何層數(shù))轉(zhuǎn)換為只有一層的數(shù)組。 舉個例子,假設(shè)有個...

    tuantuan 評論0 收藏0
  • JavaScript專題系列文章

    摘要:專題系列共計篇,主要研究日常開發(fā)中一些功能點的實現(xiàn),比如防抖節(jié)流去重類型判斷拷貝最值扁平柯里遞歸亂序排序等,特點是研究專題之函數(shù)組合專題系列第十六篇,講解函數(shù)組合,并且使用柯里化和函數(shù)組合實現(xiàn)模式需求我們需要寫一個函數(shù),輸入,返回。 JavaScript 專題之從零實現(xiàn) jQuery 的 extend JavaScritp 專題系列第七篇,講解如何從零實現(xiàn)一個 jQuery 的 ext...

    Maxiye 評論0 收藏0
  • JavaScript 數(shù)組展開(平化)和underscore的 flatten

    摘要:原文地址數(shù)組展開就是將嵌套的數(shù)組扁平化轉(zhuǎn)換為一維的判斷每一項是否是數(shù)組,然后遞歸遞歸調(diào)用數(shù)組在調(diào)用會將數(shù)組轉(zhuǎn)換成再執(zhí)行方法會變成還需要將所有的參數(shù)轉(zhuǎn)換為數(shù)字,所以這種方式的不足就是如果數(shù)組里面是既有數(shù)字又有字符串,會全部展開為數(shù)字轉(zhuǎn)為數(shù)字方 原文地址 數(shù)組展開就是將嵌套的數(shù)組扁平化(轉(zhuǎn)換為一維的)eg: const arr=[[[1, 2], [1, 2, 3]], [1, 2]] ...

    awokezhou 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<