如何重命名对象的head键为newHead且不丢失子属性值?
修改对象键名同时保留子属性的几种方法
嘿,这个需求挺常见的,我给你分享几个实用的方案,你可以根据自己的场景来选:
1. 创建新对象(不修改原对象,推荐纯函数场景)
如果你不想改动原来的对象,想要返回一个全新的对象,ES6的解构赋值是最优雅的方式:
const originalObj = { "head" : { "nestedObject" : { key: "value1" }, "someMoreObjects": { key: "value2" } } }; // 解构出原head并重命名为newHead,同时保留其他可能存在的键 const { head: newHead, ...restOfObj } = originalObj; const updatedObj = { newHead, ...restOfObj };
这样操作后,originalObj完全不受影响,updatedObj里就有了newHead键,而且它的子属性和原head的子属性是同一个引用(所以子属性的值不会丢失,也不需要额外拷贝)。
2. 直接修改原对象(适合不需要保留原对象的场景)
如果允许直接修改原对象,步骤很简单:先给对象添加新键并赋值为原head的值,然后删除旧的head键即可:
const originalObj = { "head" : { "nestedObject" : { key: "value1" }, "someMoreObjects": { key: "value2" } } }; // 把原head的值赋值给新键newHead originalObj.newHead = originalObj.head; // 删除旧的head键 delete originalObj.head;
这种方法会直接改变原对象,但子属性的引用关系保持不变,所有子属性的值都不会丢失。
额外提示:关于深拷贝的注意点
上面两种方法里,newHead的子对象都是引用传递,也就是说如果你后续修改newHead.nestedObject里的内容,原head(如果还存在的话)对应的子对象也会跟着变化。如果需要完全独立的副本,可以用深拷贝的方式,比如:
// 用JSON方法实现深拷贝(注意:不能处理函数、Symbol等特殊类型) originalObj.newHead = JSON.parse(JSON.stringify(originalObj.head)); delete originalObj.head;
如果你的对象里有特殊类型,建议用专门的工具库(比如Lodash的cloneDeep)来处理深拷贝。
内容的提问来源于stack exchange,提问作者cookieDope
相关产品推荐
相关产品推荐

