如何使用对象解构(Object Destructuring)对对象属性批量执行逻辑非(Logical NOT)操作并赋值
能否用对象解构简化取反属性值的赋值?
当然可行!不过你设想的let { showLinks, showMedia, showStatus} = !hide_account_settings_tabs;写法是行不通的——因为!运算符作用在对象上会直接把对象转为布尔值false,解构一个布尔值根本拿不到你需要的属性。
下面给你几种实用的解构实现方案:
方案一:先转换对象再解构(最推荐)
这种方式一次性把所有属性值取反,再通过解构重命名得到目标变量,代码简洁且可扩展性强:
const { links: showLinks, media: showMedia, status: showStatus } = Object.fromEntries( Object.entries(hide_account_settings_tabs).map(([key, value]) => [key, !value]) );
逻辑解释:
Object.entries(hide_account_settings_tabs)将原对象转为键值对数组:[['links', true], ['media', true], ['status', true]]map遍历数组,把每个值取反,得到新的键值对数组:[['links', false], ['media', false], ['status', false]]Object.fromEntries把处理后的数组转回对象- 最后通过解构,将原属性名
links重命名为showLinks,以此类推
方案二:先解构原属性再取反
如果不想额外生成新对象,可以先解构出原属性,再逐个取反赋值,比你原来的写法少了重复的对象引用:
const { links, media, status } = hide_account_settings_tabs; const showLinks = !links; const showMedia = !media; const showStatus = !status;
方案三:解构时直接取反(ES2019+)
这种写法把取反逻辑整合到解构的赋值环节,但本质和原写法差异不大,适合属性少的场景:
const { links: showLinks = !hide_account_settings_tabs.links, media: showMedia = !hide_account_settings_tabs.media, status: showStatus = !hide_account_settings_tabs.status } = hide_account_settings_tabs;
总的来说,方案一的复用性最好,当你后续需要新增属性时,只需要在原对象里添加,解构代码不需要额外修改。
内容的提问来源于stack exchange,提问作者Sam
相关产品推荐
相关产品推荐

