dave-wind / blog

native javascript blog
0 stars 0 forks source link

编程题1 写个程序把 entry 转换成如下对象 #4

Open dave-wind opened 1 year ago

dave-wind commented 1 year ago

写个程序把 entry 转换成如下对象

题目:
var entry = {
a: {
 b: {
   c: {
     dd: 'abcdd'
   }
 },
 d: {
   xx: 'adxx'
 },
 e: 'ae'
}
}

// 要求转换成如下对象
var output = {
'a.b.c.dd': 'abcdd',
'a.d.xx': 'adxx',
'a.e': 'ae'
}
dave-wind commented 1 year ago

递归解法

递归法 :前提
 首先要找到 基线条件 和 递归条件
1.什么是递归条件? 就是函数不断调用自己的条件.
2.什么是基线条件? 就是停止自身调用的条件 避免死循环

思路:
1.从函数入参思考, 这个函数首先要递归,传入的是一个对象,一层一层取抽离,所以入参需要传递obj, 递归条件是 当子集是对象时,我们就需要不断调用自身,累加key所以还要想到 把key下去; 
2.基线条件,当 obj[key]  不为对象的时候,就要停止调用; 拿到最底层的值 赋值即可
3. 肯定想到一个收集key value的全局值,传不传都可以

// 判断是否对象
function isObject(obj) {
    return Object.prototype.toString.call(obj) == '[object Object]'
}

function flatObj(obj, prex = '', res = {}) {

    for (let key in obj) {

        let keyName = prex ? prex + '.' + key : key;
        isObject(obj[key]) ? flatObj(obj[key], keyName, res) : res[keyName] = obj[key]
    }

    return res;
}