如何更高效实现双循环场景下的JavaScript对象属性赋值?
优化JavaScript对象同键赋值的方案
嘿,我来帮你捋捋这个问题——你的双循环写法确实能实现需求,但效率确实有优化空间,毕竟双循环的时间复杂度是O(n*m),当两个对象的键数量多起来的时候,会做很多没必要的对比。下面给你几种更高效的实现方式:
方案1:遍历目标对象的键(最高效、兼容性最好)
既然我们只需要更新obj_01已有的键,那直接遍历obj_01的键就够了,不用管obj_02里多余的键。这种方式的时间复杂度是O(n)(n为obj_01的键数量),比双循环高效得多:
var obj_01 = { a: '', b: '', c: '' } var obj_02 = { a: '1', b: '2', c: '3', d: '4', e: '5' } for (const key in obj_01) { // 用hasOwnProperty避免遍历原型链上的属性(养成好习惯) if (obj_02.hasOwnProperty(key)) { obj_01[key] = obj_02[key]; } } console.log(obj_01); // 输出:{ a: '1', b: '2', c: '3' }
方案2:用Object.keys() + forEach(更简洁的ES5写法)
如果你觉得for-in循环不够优雅,可以用Object.keys()获取obj_01的键数组,再用forEach遍历:
Object.keys(obj_01).forEach(key => { // 这里如果要严格检查键存在,还是推荐用hasOwnProperty // 直接用obj_02[key]的话,会跳过值为false、0、''等falsy的情况 if (obj_02.hasOwnProperty(key)) { obj_01[key] = obj_02[key]; } });
方案3:ES6+ 进阶写法(适合需要过滤或创建新对象的场景)
如果你不想修改原obj_01,或者需要更灵活的过滤逻辑,可以用Object.entries和Object.fromEntries组合:
1. 修改原对象(仅更新同键)
// 先过滤出obj_02中存在于obj_01的键值对 const filteredUpdates = Object.fromEntries( Object.entries(obj_02).filter(([key]) => key in obj_01) ); // 合并到obj_01 Object.assign(obj_01, filteredUpdates);
2. 创建新对象(不修改原对象)
// 保留obj_01的所有键,用obj_02的对应值覆盖,没有则保留原值 const newObj = Object.fromEntries( Object.entries(obj_01).map(([key, originalVal]) => [ key, obj_02.hasOwnProperty(key) ? obj_02[key] : originalVal ]) );
为什么原方法不够高效?
你的原双循环会遍历obj_02的每一个键,再遍历obj_01的所有键做对比——比如例子里obj_02有5个键,obj_01有3个,会执行15次对比操作;而优化后的方法只需要执行3次检查,效率提升非常明显,尤其是当对象包含大量键的时候。
内容的提问来源于stack exchange,提问作者sof-03
相关产品推荐
相关产品推荐

