JavaScript是否有原生方法将嵌套对象转为点分隔键名的扁平对象?
嵌套对象转扁平对象的实现方案
原生方法说明
JavaScript 目前没有原生内置方法可以直接将嵌套对象转换为以点分隔键名的扁平对象,你需要手动实现对应的逻辑。
你的代码分析
你当前的代码能处理两层嵌套的场景,但存在几个局限:
- 仅支持固定两层的嵌套结构,遇到更深层级(比如
{a: {b: {c: 1}}})会直接失效 - 循环中直接修改原对象并删除属性,可能引发遍历过程中的意外问题
delete Object.assign(test, {...})里的delete是多余的,Object.assign已经完成了新属性的添加操作
更优的实现方案
通用递归版本(支持任意深度嵌套)
这个版本可以处理任意层级的嵌套对象,且不会修改原对象,返回全新的扁平对象:
function flattenObj(obj, parentKey = '') { let result = {}; for (const [key, value] of Object.entries(obj)) { const currentKey = parentKey ? `${parentKey}.${key}` : key; if (typeof value === 'object' && value !== null && !Array.isArray(value)) { // 递归处理嵌套子对象 Object.assign(result, flattenObj(value, currentKey)); } else { result[currentKey] = value; } } return result; } // 测试示例 const test = { sample: { name: 'joe', age: 69, info: { city: 'NY', job: 'engineer' } } }; const flattened = flattenObj(test); console.log(flattened); // 输出: { 'sample.name': 'joe', 'sample.age': 69, 'sample.info.city': 'NY', 'sample.info.job': 'engineer' }
两层嵌套专属简化版本(确定层级时使用)
如果你明确只会处理两层嵌套的场景,可以简化代码逻辑:
const test = { sample: { name: 'joe', age: 69, }, }; const flattened = {}; for (const [pKey, pValue] of Object.entries(test)) { for (const [key, value] of Object.entries(pValue)) { flattened[`${pKey}.${key}`] = value; } } console.log(flattened);
额外说明
- 如果对象中包含数组,上述递归版本会将数组视为普通值;若需要把数组索引也拼入键名,可以在判断逻辑中添加数组的处理分支
- 注意排除
null值,因为typeof null === 'object',需在判断中加入value !== null避免错误递归
内容的提问来源于stack exchange,提问作者abdallahhkaram
相关产品推荐
相关产品推荐

