对象扁平化

弁言

正午起来有个人问了我一个题,怎样完成对象扁平化,如图
《对象扁平化》

细致一看这不就是条理遍历么,又细致一看,我彷佛还没研讨过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;
}
    原文作者:jasminecjc
    原文地址: https://segmentfault.com/a/1190000007043435
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞