对象扁平化(递归实现)练习题

49 阅读1分钟
const obj1 = {
    a: 1,
    b: {
        f: '2',
        g: '3',
    },
    c: {
        d: [
            1,
            2,
            {
                e: true,
            },
        ],
    },
}

如上图是原对象,通过js代码转换为下图的对象

const  obj2 = {
  a: 1,
  'b.f': '2',
  'b.g': '3',
  'c.d.0': 1,
  'c.d.1': 2,
  'c.d.2.e': true
}

实现的代码如下图

function plat(obj, prekey, resobj) {
    // prekey是用于累加.的
    prekey = prekey ? prekey + '.' : ''
    let keys = Object.keys(obj)
    keys.forEach((item) => {
        let val = obj[item]
        let type = typeof val
        // 判断对象值是否为对象(包括对象和array)
        if (type ==='object'  && val) {
            // 递归
            plat(val, prekey + item, resobj)
        } else {
            // 有值
            if (val !== null && val !== undefined) {
                // 给传递的要改变的数组赋值
                resobj[prekey + item] = val
            }
        }
    })
}
plat(obj1, '', obj2)
console.log(obj2);