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 遍历对象的所有层级:
- 创建结果对象
res - 定义递归函数
dfs(obj, prefix):- 如果是对象或数组,继续递归
- 如果是数组,使用
[index]格式拼接路径 - 如果是对象,使用
.key格式拼接路径 - 如果是基本类型值,将
prefix: value存入结果
- 从根对象开始遍历所有 key
关键点
需要区分对象和数组,使用不同的路径拼接方式
数组使用
[index]格式,对象使用.key格式递归终止条件是遇到基本类型值
注意处理
null(typeof null === "object")时间复杂度
,其中 是对象中所有键值对的数量 空间复杂度
,其中 是对象的最大深度