如何高性能复制对象属性名并将值统一设为false?
高性能实现动态生成全false值的一级键对象
嘿,这个需求我刚好踩过坑,针对你要的动态匹配原对象一级键、所有值设为false的场景,最推荐的高性能ES6+方案是用Object.fromEntries()搭配Object.keys()的组合,引擎底层优化过的原生方法比手动循环或者先拷贝再修改高效太多,尤其是对象键数量较多的时候。
最优实现代码
const firstObject = { key1: 'value1', key2: 'value2', /* 更多键 */ }; const secondObject = Object.fromEntries( Object.keys(firstObject).map(key => [key, false]) );
为什么这是高性能方案?
- 原生方法加持:
Object.keys()和Object.fromEntries()都是JS引擎底层优化的API,比手动写for循环或者forEach的执行效率高很多 - 无多余开销:直接从键数组生成键值对数组,一步转换为目标对象,避免了创建空对象再逐个赋值的中间步骤
- 完全满足需求:自动匹配
firstObject的所有一级键,不需要硬编码任何键名,且只处理一级深度,完全符合你的要求
其他常见方案的性能对比
手动循环方案(性能略差)
虽然也能实现,但手动赋值的引擎优化不如原生组合方法:
const secondObject = {}; for (const key of Object.keys(firstObject)) { secondObject[key] = false; }
浅拷贝后修改(性能最差)
这种方案会做两次对象遍历(一次拷贝,一次修改),额外开销最大,不推荐:
const secondObject = {...firstObject}; for (const key of Object.keys(secondObject)) { secondObject[key] = false; }
ES6兼容 fallback(如果不支持Object.fromEntries)
如果你的环境只能支持基础ES6(比如不支持ES2019的fromEntries),可以用Object.assign()配合展开语法,性能略逊于前者,但依然比手动循环高效:
const secondObject = Object.assign( {}, ...Object.keys(firstObject).map(key => ({ [key]: false })) );
内容的提问来源于stack exchange,提问作者0xC0DED00D
相关产品推荐
相关产品推荐

