摘要:引言中午起來有個人問了我一個題,怎么實現對象扁平化,如圖仔細一看這不就是層次遍歷么,又仔細一看,我好像還沒研究過如何寫數據結構,作罷,花了兩小時暴力解決思路本來想的是對象或者數組,對象有個好處,可以標識是第幾層,但是數組操作比較方便,有的方
引言
中午起來有個人問了我一個題,怎么實現對象扁平化,如圖
仔細一看這不就是層次遍歷么,又仔細一看,我好像還沒研究過js如何寫數據結構,作罷,花了兩小時暴力解決
思路本來想的是對象或者數組,對象有個好處,可以標識是第幾層,但是數組操作比較方便,有lodash的方法可以直接扁平化,就偷了個懶,但是一下實現方法對象和數組通用,都可以輸出正確的結果
代碼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);
結果如下:
$ 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" ]
分別是對象方式和數組方式的結果
難點遇到了二維數組的問題,我的方式是在push每個數組之前都檢查一遍存在不存在,有人給的建議是先得到完整的數組再去重,因為我采取的是多維數組,考慮到多維數組去重也許效率了不高?沒有仔細研究,問題描述和解決如下
[[[1,2,3],[1,2,3]].includes([1,2,3])返回false](https://segmentfault.com/q/10...
中午起來小伙伴給我發了個改進版的,不用去重,我覺得比我原來的好很多,分享一下
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; }
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/80562.html
摘要:與持久化工程師花了年時間打造,與同期出現。有持久化數據結構,如等,并發安全。總結篇幅有限,時間也比較晚了,關于前端數據的扁平化與持久化處理先講這么多了,有興趣的同學可以關注下,后面有時間會多整理分享。 (PS: 時間就像海綿里的水,擠到沒法擠,只能擠擠睡眠時間了~ 知識點還是需要整理的,付出總會有收獲,tired but fulfilled~) 前言 最近業務開發,從零搭建網頁生成器,...
摘要:對象覆蓋了的方法方法連接數組并返回一個字符串,其中包含用逗號分隔的每個數組元素運用這個方法,可以處理數組扁平化不過有一些限制。 toString() Object.prototype.toString() Array.prototype.toString() Boolean.prototype.toString() RegExp.prototype.toString() String....
摘要:專題系列第九篇,講解如何實現數組的扁平化,并解析的源碼扁平化數組的扁平化,就是將一個嵌套多層的數組嵌套可以是任何層數轉換為只有一層的數組。 JavaScript 專題系列第九篇,講解如何實現數組的扁平化,并解析 underscore 的 _.flatten 源碼 扁平化 數組的扁平化,就是將一個嵌套多層的數組 array (嵌套可以是任何層數)轉換為只有一層的數組。 舉個例子,假設有個...
摘要:專題系列共計篇,主要研究日常開發中一些功能點的實現,比如防抖節流去重類型判斷拷貝最值扁平柯里遞歸亂序排序等,特點是研究專題之函數組合專題系列第十六篇,講解函數組合,并且使用柯里化和函數組合實現模式需求我們需要寫一個函數,輸入,返回。 JavaScript 專題之從零實現 jQuery 的 extend JavaScritp 專題系列第七篇,講解如何從零實現一個 jQuery 的 ext...
摘要:原文地址數組展開就是將嵌套的數組扁平化轉換為一維的判斷每一項是否是數組,然后遞歸遞歸調用數組在調用會將數組轉換成再執行方法會變成還需要將所有的參數轉換為數字,所以這種方式的不足就是如果數組里面是既有數字又有字符串,會全部展開為數字轉為數字方 原文地址 數組展開就是將嵌套的數組扁平化(轉換為一維的)eg: const arr=[[[1, 2], [1, 2, 3]], [1, 2]] ...
閱讀 3893·2021-11-17 09:33
閱讀 1201·2021-10-09 09:44
閱讀 403·2019-08-30 13:59
閱讀 3483·2019-08-30 11:26
閱讀 2185·2019-08-29 16:56
閱讀 2855·2019-08-29 14:22
閱讀 3154·2019-08-29 12:11
閱讀 1278·2019-08-29 10:58