为了账号安全,请及时绑定邮箱和手机立即绑定

JS对象降低维度

JS对象降低维度

蓝山帝景 2019-03-15 18:15:59
在某个特定场景中,比如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 回答

?
守候你守候我

TA贡献1802条经验 获得超10个赞

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


你那实现效果参照下面


 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)


查看完整回答
反对 回复 2019-03-27
  • 2 回答
  • 0 关注
  • 456 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信