摘要:引言中午起來有個人問了我一個題,怎么實現(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...
中午起來小伙伴給我發(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
摘要:與持久化工程師花了年時間打造,與同期出現(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)頁生成器,...
摘要:對象覆蓋了的方法方法連接數(shù)組并返回一個字符串,其中包含用逗號分隔的每個數(shù)組元素運用這個方法,可以處理數(shù)組扁平化不過有一些限制。 toString() Object.prototype.toString() Array.prototype.toString() Boolean.prototype.toString() RegExp.prototype.toString() String....
摘要:專題系列第九篇,講解如何實現(xiàn)數(shù)組的扁平化,并解析的源碼扁平化數(shù)組的扁平化,就是將一個嵌套多層的數(shù)組嵌套可以是任何層數(shù)轉(zhuǎn)換為只有一層的數(shù)組。 JavaScript 專題系列第九篇,講解如何實現(xiàn)數(shù)組的扁平化,并解析 underscore 的 _.flatten 源碼 扁平化 數(shù)組的扁平化,就是將一個嵌套多層的數(shù)組 array (嵌套可以是任何層數(shù))轉(zhuǎn)換為只有一層的數(shù)組。 舉個例子,假設(shè)有個...
摘要:專題系列共計篇,主要研究日常開發(fā)中一些功能點的實現(xiàn),比如防抖節(jié)流去重類型判斷拷貝最值扁平柯里遞歸亂序排序等,特點是研究專題之函數(shù)組合專題系列第十六篇,講解函數(shù)組合,并且使用柯里化和函數(shù)組合實現(xiàn)模式需求我們需要寫一個函數(shù),輸入,返回。 JavaScript 專題之從零實現(xiàn) jQuery 的 extend JavaScritp 專題系列第七篇,講解如何從零實現(xiàn)一個 jQuery 的 ext...
摘要:原文地址數(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]] ...
閱讀 3904·2021-11-17 09:33
閱讀 1207·2021-10-09 09:44
閱讀 409·2019-08-30 13:59
閱讀 3486·2019-08-30 11:26
閱讀 2190·2019-08-29 16:56
閱讀 2858·2019-08-29 14:22
閱讀 3156·2019-08-29 12:11
閱讀 1280·2019-08-29 10:58