天天看點

js的tree數組對象扁平化思否_對象扁平化_jascheng的前端學習 - SegmentFault 思否

引言

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

js的tree數組對象扁平化思否_對象扁平化_jascheng的前端學習 - SegmentFault 思否

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

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;

}