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 就解析不出来了。求解,还求写这种递归的需求时,我怎么知道在什么时间点去调用自己,循环到什么程度以后再去调用自己 ?
阅读 2.2k
2 个回答

自己回答一下:

function fn(obj, str) {
            if(Object.prototype.toString.call(obj) === '[object Object]'){
                for(var k in obj){
                    fn(obj[k],str+k+'')
                }
            }else{
                res[str.split('').join('.')] = obj
            }
        }
        fn(m,'');
        console.log(res)

另外还有一个问题,为什么把str字符串相加,换成数组然后push,结果就不对了???

function fn(obj, str) {
            if(Object.prototype.toString.call(obj) === '[object Object]'){
                for(var k in obj){
                    // fn(obj[k],str+k+'')
                    str.push(k);
                    fn(obj[k],str)
                }
            }else{
                // res[str.split('').join('.')] = obj
                res[str.join('.')] = obj
            }
        }
        // fn(m,'');
        fn(m,[]);
        console.log(res)

在自己回答一下:因为push修改原来的str了。

只要跟自己长得类似就继续调用,直到跟自己不一样终止

你那实现效果参照下面

 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)
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题