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;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值