
本文介绍如何将单层嵌套对象(如 { key: { ... } })简化为直接包含内层属性的对象,通过 Object.values() 和 Object.assign() 实现无损扁平化。
本文介绍如何将单层嵌套对象(如 `{ key: { ... } }`)简化为直接包含内层属性的对象,通过 `object.values()` 和 `object.assign()` 实现无损扁平化。
在 JavaScript 开发中,我们偶尔会遇到结构过于“包裹”的对象——例如后端返回的数据统一被一个语义性顶层键(如 page、data、response)封装。若该顶层键仅起占位作用,而业务逻辑始终操作其内部结构,则手动解构会降低代码可读性与复用性。此时,一种简洁、函数式且无需遍历键名的方式是:提取对象所有值(Object.values()),再合并为一个新对象(Object.assign())。
✅ 推荐方案:一行式安全展开
const obj = {
page: {
title: 'x',
images: {
0: {
src: 'https://example.com/img.jpg'
}
}
}
};
const flattened = Object.assign({}, ...Object.values(obj));
console.log(flattened);
// → { title: 'x', images: { '0': { src: 'https://example.com/img.jpg' } } }
? 原理说明:
Object.values(obj)返回[obj.page](即一个仅含单个元素的数组);- 展开运算符
...将其解包为Object.assign({}, obj.page);Object.assign()将obj.page的所有自有可枚举属性复制到空对象中,完成“去壳”。
⚠️ 注意事项
-
仅适用于单键对象:若
obj包含多个键(如{ page: {...}, meta: {...} }),Object.values()会返回多个对象,Object.assign将按顺序合并——后出现的属性会覆盖同名前项。此时需明确业务意图,或改用更精准的解构方式(如const { page } = obj)。 -
不支持 Symbol 键或不可枚举属性:
Object.values()仅处理字符串键的可枚举属性,符合绝大多数 JSON 场景。 - 非突变操作:该方法创建全新对象,原对象保持不变,符合函数式编程原则。
? 替代写法(ES2019+)
若需更高可读性或兼容旧环境,也可使用扩展运算符替代 Object.assign:
const [inner] = Object.values(obj); // 安全取第一个值(假设必有且唯一)
const flattened = { ...inner };
但注意:当 obj 为空对象时,Object.values(obj) 返回空数组,解构将得到 undefined,需做存在性判断。
✅ 总结
Object.assign({}, ...Object.values(obj)) 是移除单层包装键的简洁、标准、高效方案。它语义清晰、无副作用、兼容性好(IE11+),推荐作为通用工具函数封装复用:
const unshell = obj => Object.assign({}, ...Object.values(obj));
// 使用:unshell({ data: { id: 1, name: 'test' } }) → { id: 1, name: 'test' }










