Skip to content

2. 对象扁平化

题目

实现对象扁平化:将嵌套对象转换为扁平对象,使用点号和方括号表示层级关系。

代码

js
// 对象扁平化:嵌套对象转扁平对象

function flatten(obj) {
    const res = {};
    function dfs(obj, prefix) {
        if(typeof obj === "object" && obj !== null) {
            if(Array.isArray(obj)) { // 数组
                obj.forEach((item, index) => {
                    dfs(item, `${prefix}[${index}]`)
                })
            } else { // 对象
                Object.keys(obj).forEach((key) => {
                    dfs(obj[key], prefix ? `${prefix}.${key}` : key);
                })
            }
        } else { // 基本值
            res[prefix] = obj;
        }
    }
    Object.keys(obj).forEach((key) => {
        dfs(obj[key], key);
    })
    return res;
}

const obj = {
    a: {
        b: {
            c: [1, 4],
            d: 2
        },
        e: 3
    }
};

console.log(flatten(obj));

思路

使用递归 + DFS 遍历对象的所有层级:

  1. 创建结果对象 res
  2. 定义递归函数 dfs(obj, prefix)
    • 如果是对象或数组,继续递归
    • 如果是数组,使用 [index] 格式拼接路径
    • 如果是对象,使用 .key 格式拼接路径
    • 如果是基本类型值,将 prefix: value 存入结果
  3. 从根对象开始遍历所有 key

关键点

  • 需要区分对象和数组,使用不同的路径拼接方式

  • 数组使用 [index] 格式,对象使用 .key 格式

  • 递归终止条件是遇到基本类型值

  • 注意处理 nulltypeof null === "object"

  • 时间复杂度 O(n),其中 n 是对象中所有键值对的数量

  • 空间复杂度 O(d),其中 d 是对象的最大深度