数据扁平化面试题

数据扁平化面试题

  • 数据扁平化,输入可以是一个对象或一个数组,去掉对象中的null和undefined值,输出一个扁平化对象
// var input = [
//     'test',
//     null,
//     12,
//     [
//         1,
//         2,
//         {
//             d010: 10,
//             d011: 20,
//             d012: [
//                 10,
//                 20,
//                 {
//                     d0120: 40,
//                     d0121: 50
//                 }
//             ]
//         },
//         [
//             1, 30, 50
//         ]
//     ],
//     'hello world'
// ]
var input = {
    a: 10,
    b: {
        b0: 10,
        b1: null,
        b2: [
            1,
            2,
            {
                b201: 10,
                b202: [10, 20, 30],
                b203: 30
            }
        ],
        b3: {
            b30: 10,
            b31: 20
        }
    },
    c: null,
    d: [
        'test',
        null,
        12,
        [
            1,
            2,
            {
                d010: 10,
                d011: 20
            },
            [
                1, 30, 50
            ]
        ],
        'hello world'
    ],
    e: undefined,
    f: 'test',
    h: '',
    i: 0,
    f: [
        'test',
        null,
        12,
        [
            1,
            2,
            {
                d010: 10,
                d011: 20,
                d012: [
                    10,
                    20,
                    {
                        d0120: 40,
                        d0121: 50
                    }
                ]
            },
            [
                1, 30, 50
            ]
        ],
        'hello world'
    ]
}

function isNotEmpty(_obj) {
    return _obj !== null && _obj !== undefined
}

/** 判断是否为对象 */
const isObject = _obj => Object.prototype.toString.call(_obj).replace('[object ', '').replace(']', '') === 'Object'

/** 递归我们的对象 */
function loopObject(_obj, _key) {
    let newObj = {}

    for (let _name in _obj) {
        let _item = _obj[_name]
        if (isNotEmpty(_item)) {
            let __key = !!_key ? _key + '.' + _name : _name
            if (isObject(_item)) {

                // let _newObj = loopObject(_item)
                // 对象合并
                // newObj = {...newObj, ..._newObj}
                // Object.assign(newObj, _newObj)
                // 最终方法
                // Object.assign(newObj, loopObject(_item, _name))
                Object.assign(newObj, loopObject(_item, __key))

                // for (let __name in _item) {
                //     let __item = _item[__name]
                //     if (isNotEmpty(__item)) {
                //         newObj[_name + '.' + __name] = __item
                //     }
                // }
            } else if (isArray(_item)) {
                Object.assign(newObj, loopArray(_item, __key))
            } else {
                newObj[__key] = _item
            }
            
        }
    }

    return newObj
}

/** 判断数组的方法 */
const isArray = _obj => Object.prototype.toString.call(_obj).replace('[object ', '').replace(']', '') === 'Array'

/** 递归我们的数组 */
function loopArray(_arr, _key) {
    let newObj = {}
    _arr.forEach(function(_item, _i) {
        if (isNotEmpty(_item)) {
            let __key = !_key ? `[${_i}]` : _key + `[${_i}]`
            if (isArray(_item)) {
                Object.assign(newObj, loopArray(_item, __key))
            } else if (isObject(_item)) {
                Object.assign(newObj, loopObject(_item, __key))
            } else {
                newObj[__key] = _item
            }
        }
    })
    return newObj
}

function flatten(_ipt) {
    let newObj = {}

    if (isArray(_ipt)) {
        newObj = loopArray(_ipt)
    } else if (isObject(_ipt)) {
        newObj = loopObject(_ipt)
    } else {
        newObj = _ipt
    }

    // '[3]': [ 1, 2, { d010: 10, d011: 20 }, [ 1, 30, 50 ] ],
    // '[3][0]': 1
    

    // for (let _name in _ipt) {
    //     let _item = _ipt[_name]
    //     if (isNotEmpty(_item)) {
    //         if (isObject(_item)) {
    //             for (let __name in _item) {
    //                 let __item = _item[__name]
    //                 if (isNotEmpty(__item)) {
    //                     newObj[_name + '.' + __name] = __item
    //                 }
    //             }
    //         } else {
    //             newObj[_name] = _item
    //         }
            
    //     }
    // }

    return newObj
}

var output = flatten(input)
console.log(output)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值