JS对象降低维度

在某个特定场景中,比如m={“a”:1,"b":{"c":2,"d":[3,4]}},须将他的层级展开,结果:


m={"a":1,"b.c":2,"b.d":[3,4]}


我的代码:


        var m = {

            "a": 1,

            "b": {

                "c": 2,

                "d": [3, 4],

                "e": {

                    "f":5

                }

            }

        }

        function fn(obj) {

            if (Object.prototype.toString.call(obj) === '[object Object]') {//obj:{}

            var newObj = {};

                for (var k in obj) {

                    if(Object.prototype.toString.call(obj[k]) === '[object Object]'){

                        for(var j in obj[k]){

                            if(Object.prototype.toString.call(obj[k][j]) === '[object Object]'){

                                newObj[k+'.'+j] = fn(obj[k][j])

                            }else{

                                newObj[k+'.'+j] = obj[k][j]

                            }

                        }

                    }else{

                        newObj[k] = obj[k]

                    }

                }

            } else {

                return obj

            }

            return newObj

        }

        console.log(fn(m))

我这么写对a到d,得到的是正确结果,但是再来一层a.e.f = 5 就解析不出来了。求解,还求写这种递归的需求时,我怎么知道在什么时间点去调用自己,循环到什么程度以后再去调用自己 ?


蓝山帝景
浏览 457回答 2
2回答

守候你守候我

只要跟自己长得类似就继续调用,直到跟自己不一样终止你那实现效果参照下面 var m = {   "a": 1,   "b": {     "c": 2,     "d": [3, 4],     "e": {       "f": 5     }   } } function fn(obj, keys, ret) {   if (typeof obj === 'object') {     Object.keys(obj).forEach(key => {      fn(obj[key], [...keys, key], ret)     })   } else {     ret[keys.join('.')] = obj   } } var ret = {} fn(m, [], ret) console.log(ret)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript