
本文介绍如何将嵌套在单一层级键下的对象内容“提一层”,即移除顶层键名,直接获取其对应的值对象,适用于如 api 响应解构、数据扁平化等场景。
本文介绍如何将嵌套在单一层级键下的对象内容“提一层”,即移除顶层键名,直接获取其对应的值对象,适用于如 api 响应解构、数据扁平化等场景。
在实际开发中,我们常遇到后端返回的响应结构类似 { page: { title: 'x', images: { ... } } } ——整个有效数据被包裹在一个固定键(如 page、data、result)之下。为便于后续处理,往往需要剥离这层冗余包装,直接操作内部对象。
最简洁、现代且兼容性良好的方式是使用 Object.values() 配合 Object.assign():
const obj = {
page: {
title: 'x',
images: {
0: {
src: '...'
}
}
}
};
const flattened = Object.assign({}, ...Object.values(obj));
console.log(flattened);
// → { title: 'x', images: { '0': { src: '...' } } }
✅ 原理说明:
-
Object.values(obj)返回一个数组,包含obj所有可枚举属性的值;当obj只有一个键(如page)时,该数组长度为 1,形如[ { title: 'x', images: { ... } } ]; -
...Object.values(obj)展开此数组,等价于将该子对象作为参数传入Object.assign(); -
Object.assign({}, ...)创建一个新空对象,并把子对象的所有自有可枚举属性复制进去——本质上完成了“去壳”操作。
⚠️ 注意事项:
- 此方法仅适用于顶层恰好只有一个键的场景。若
obj包含多个键(如{ page: {...}, meta: {...} }),Object.values()会返回多个对象,Object.assign将按顺序合并,可能导致属性覆盖(后项覆盖前项同名属性),结果不可控; - 若需健壮性保障,建议先校验键数量:
const values = Object.values(obj); if (values.length !== 1) { throw new Error('Expected exactly one top-level key'); } const result = Object.assign({}, values[0]); - 不支持 Symbol 键(
Object.values()忽略 Symbol 属性);若需完整遍历,可改用Reflect.ownKeys()+ 手动过滤。
? 替代方案(ES2019+):
也可使用扩展运算符语法糖(语义更清晰):
const [inner] = Object.values(obj);
const result = { ...inner };
总结:Object.assign({}, ...Object.values(obj)) 是一行解决“移除单层包装键”的高效方案,兼具可读性与实用性,推荐在明确数据结构的前提下优先采用。










