鍍金池/ 問答/數(shù)據(jù)分析&挖掘  C++  HTML/ js 將對象的屬性全部提升到第一層

js 將對象的屬性全部提升到第一層

數(shù)據(jù)結(jié)構(gòu)如下

var a = {
    b: {
        c: {
            d: '平底鍋'
        }
    },
    e: {
        f: {
            g: 'M416'
        },
        h: {
            i: '98K'
        }
    }
}

請編寫算法:
要求能訪問 a.b_c_d 可以得到 平底鍋
要求能訪問 a.e_f_g 可以得到 M416
要求能訪問 a.e_f_i 可以得到 98K

最終結(jié)果數(shù)據(jù)結(jié)構(gòu)如下

        b_c_d: '平底鍋',
        e_f_g: 'M416',
        e_f_h: '98K'
   }

我覺得應(yīng)該是使用遞歸,但是不知道怎么修改到a的key,請各位指教

回答
編輯回答
祉小皓

可以去看一下二叉樹的遞歸,相信應(yīng)該有幫助

2018年8月25日 20:35
編輯回答
澐染

恩,你一定吃雞吃多了。。。
這是我封裝的一個更改屬性名稱的方法。思想就是判斷其屬性是否是對象,如果是,那么遞歸調(diào)用并記錄路徑path。
如果不是就把它返回到一個新的對象中。

var obj2 = {}
function changeObj(obj,path) {
    if (typeof obj === 'object') {
        for (x in obj) {
            changeObj(obj[x],path+x)
        }
    }
    else {
        obj2[path] = obj
    }
}

當(dāng)然,這個算法有一定的局限性。不過在你這個例子中是可以適用的。你可以試試

2017年3月6日 20:57
編輯回答
別傷我

我發(fā)現(xiàn)大家都只判斷了typeof(obj) === 'object' 但是還要判斷是否是null
我原先一直在糾結(jié)沒有指針怎么修改原變量,現(xiàn)在找到了一個簡單的辦法

var a = {
    b: {
        c: {
            d: '平底鍋'
        }
    },
    e: {
        f: {
            g: 'M416'
        },
        h: {
            i: '98K'
        }
    }
}

function func(r, obj, father) {
    for (key in obj) {
        if (typeof (obj[key]) === 'object' && obj[key] != null) {
            if (father != "") {
                r = func(r, obj[key], father + "_" + key)    
            } else {
                r = func(r, obj[key], father + key)
            }
            
        } else {
            r[father + "_" + key] = obj[key]
        }
    }
    return r
}
var res = {}
console.log(func(res, a, ""))
2017年10月11日 23:08
編輯回答
半心人

遞歸拼接key就可以了呀,這是es6語法版

/**
 * 
 * @param obj
 */
function upsetObj(obj) {
  Object.entries(obj).forEach(([k, v]) => {
      Object.prototype.toString.call(v) === '[object Object]' && reacquire(k, v);
  })

  function reacquire(initial, tar) {//閉包函數(shù)為了直接使用目標(biāo)對象(即需要修改的對象)
    Object.entries(tar).forEach(([k, v]) => {
      let key = initial + '_' + k;
      if (Object.prototype.toString.call(v) === '[object Object]') {
        reacquire(key, v);
      } else {
        obj[key] = v;
      }
    })
  }
}
2018年7月1日 00:33
編輯回答
臭榴蓮
var a = {
  b: {
    c: {
      d: '平底鍋'
    }
  },
  e: {
    f: {
      g: 'M416'
    },
    h: {
      i: '98K'
    }
  }
}

function flat(obj) {
  var rtn = {};
  (function ff(inObj, tmp) {
    for(key in inObj){
      var newTmp = tmp + '_' + key
      if (typeof inObj[key] === 'string') {
        rtn[newTmp.slice(1, newTmp.length)] = inObj[key]
      } else {
        ff(inObj[key], newTmp)
      }
    }
  })(obj, '')
  return rtn
}

console.log(flat(a))
2018年4月4日 18:32