日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

对象扁平化

發布時間:2024/1/18 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 对象扁平化 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

引言

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

仔細一看這不就是層次遍歷么,又仔細一看,我好像還沒研究過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,aconst 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...

9.30更新

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

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; }

總結

以上是生活随笔為你收集整理的对象扁平化的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。