实现一个函数,打平 JS 对象。

对于一个 JS 对象,value 值可以是 Object 类型,因此可能会有很深的嵌套层次。现在要求把 JS 对象打平为一层,key 值使用 . 拼接,示例如下:
原始对象:

{
    x : { 
        a : 'zxc', 
        b : 'ert' 
    }, 
    y : { 
        z : 1234 
    }, 
    arr : [ 
     2,3 
    ] 
} 

打平后:

{ 
     'x.a' : 'zxc', 
     'x.b' : 'ert', 
     'y.z' : 1234, 
     'arr.0' : 2, 
     'arr.1' : 3 
} 

原始对象:

{ 
     x : { 
        y: { 
            z: 12, 
            u: 15 
        } 
     } 
} 

打平后:

{ 
     'x.y.z': 12, 
     'x.y.u': 15 
} 

要求:函数命名为 flatObj,输入原对象,返回打平后新的对象。
//obj 是原对象,fobj 是打平后的对象。
let fobj = flatObj(obj)
提示:使用递归实现,typeof 和 Array.isArray 检测数组类型。

求采纳


var b = {
    x : { 
        a : 'zxc', 
        b : 'ert' 
    }, 
    y : { 
        z : 1234 
    }, 
    arr : [ 
     2,3 
    ] 
} 

function dg(obj,now_key,new_obj,is_root_property){
    var keys = Object.keys(obj)
    for(let i in keys){
        var sufflex_key = is_root_property?
            (Array.isArray(obj)?i:keys[i]):(Array.isArray(obj)?('.'+i):('.'+keys[i]))
        if(typeof(obj[keys[i]]) !== 'object'){
            new_obj[now_key+sufflex_key]=obj[keys[i]]
        }else{
            dg(obj[keys[i]],now_key+sufflex_key,new_obj,false)
        }
    }
}

new_obj = {}
dg(b,'',new_obj,true)
console.log(new_obj)