鍍金池/ 問(wèn)答/HTML/ JS對(duì)象降低維度

JS對(duì)象降低維度

在某個(gè)特定場(chǎng)景中,比如m={“a”:1,"b":{"c":2,"d":[3,4]}},須將他的層級(jí)展開(kāi),結(jié)果:

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))
我這么寫(xiě)對(duì)a到d,得到的是正確結(jié)果,但是再來(lái)一層a.e.f = 5 就解析不出來(lái)了。求解,還求寫(xiě)這種遞歸的需求時(shí),我怎么知道在什么時(shí)間點(diǎn)去調(diào)用自己,循環(huán)到什么程度以后再去調(diào)用自己 ?
回答
編輯回答
茍活

只要跟自己長(zhǎng)得類似就繼續(xù)調(diào)用,直到跟自己不一樣終止

你那實(shí)現(xiàn)效果參照下面

 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)
2017年12月25日 09:39
編輯回答
心悲涼

自己回答一下:

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)

另外還有一個(gè)問(wèn)題,為什么把str字符串相加,換成數(shù)組然后push,結(jié)果就不對(duì)了???

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)

在自己回答一下:因?yàn)閜ush修改原來(lái)的str了。

2017年11月2日 08:49