如何基于第三个参考对象将原对象的指定属性“移动”到新对象并优化实现逻辑?
实现属性“移动”的简洁方案
没问题,我来帮你优化这个需求的实现!你想要的是只创建aPet对象,同时让原animals对象直接剩下非宠物属性,不需要额外生成notAPet,可以试试下面这几种更简洁的写法:
方法一:遍历目标键集(高效推荐)
既然我们已经明确要提取的属性是pets里的键,直接遍历这些键比遍历整个animals更高效,同时结合delete操作修改原对象:
const pets = { 'cat': {}, 'dog': {} }; let animals = { 'cat': 'black', 'dog': 'white', 'whale': 'blue', 'albatross': 'grey' }; const aPet = {}; // 遍历需要提取的宠物键 Object.keys(pets).forEach(key => { if (animals.hasOwnProperty(key)) { // 用hasOwnProperty更严格检查自身属性,也可以用`key in animals` aPet[key] = animals[key]; delete animals[key]; // 从原对象中移除该属性 } });
为什么这更优?
- 只遍历需要处理的键(
pets的键),如果animals对象很大,性能会比遍历全部属性好很多 - 直接修改原
animals对象,不需要额外创建notAPet,完全符合你的需求 - 代码逻辑清晰,比原循环更简洁
方法二:动态解构写法(更现代风格)
如果喜欢更偏向函数式的写法,可以结合解构思路,但因为键是动态的,还是需要借助遍历实现:
const pets = { 'cat': {}, 'dog': {} }; let animals = { 'cat': 'black', 'dog': 'white', 'whale': 'blue', 'albatross': 'grey' }; const aPet = {}; // 动态提取并删除属性 for (const key of Object.keys(pets)) { if (key in animals) { [aPet[key], animals[key]] = [animals[key], undefined]; delete animals[key]; } }
注意事项
- 如果
pets里的键在animals中不存在,delete操作不会报错,但加上if判断可以避免给aPet赋值undefined - 不建议用
Object.assign先复制再删除,那样会多一步无意义的全对象复制,效率不如直接遍历目标键
这样处理后,aPet就会包含所有从animals中移出的宠物属性,而animals本身就变成了你之前代码里的notAPet,完全不需要额外创建第二个对象~
内容的提问来源于stack exchange,提问作者match
相关产品推荐
相关产品推荐

