如何将对象数组转换为键对应数组值的对象,求reduce优化实现方案
对象数组转聚合对象的reduce优化实现方案
你当前的实现存在两个可优化点:
- 额外声明了外部的
reduced_object变量,产生不必要的副作用,也没有用到reduce本身的累加器特性 - 最终返回的是对象,但命名为
reduced_array存在语义歧义
优化后代码
const companies=[ {name:'Company One',email:'trishabh885@gmail.com',phone:'8860138213', category:'Finance',start:1981,end:2003,date:'21-06-2009'}, {name:'X Name',email:'grfgr@gmail.com',phone:'8860138213', category:'Finance',start:1981,end:2003,date:'21-06-2009'}, {name:'A one',email:'grfgt@yahoo.com',phone:'943548213', category:'Lecture',start:1981,end:2003,date:'21-06-2009'}, {name:' Name',email:'gtrgt@gmail.com',phone:'9656013653', category:'Finance',start:1981,end:2003}, {name:'Company Name',email:'grgtrgg@gmail.com', category:'Finance',start:1981,end:2003,date:'21-06-2009'}, {name:'sdksdjd',email:'bfbrg@gbmail.com',phone:'7485788475898548', category:'Sciennce',start:1981,end:2003,date:'21-06-2009'}, {name:'kdjfkf',email:'gfggfb@gmail.com',phone:'0959898860138213', category:'Finance',start:1981,end:2003,date:'21-06-2009'}, {name:'vdjf',email:'g5rgf@gmail.com',phone:'050498860138213', category:'Finance',start:1981,end:2003,date:'21-06-2009'}, {name:'vdjvk',email:'trishabh885@gmail.com',phone:'958958860138213', category:'Finance',start:1981,end:2003,date:'21-06-2009'}, {name:'vdkv',email:'trishabh885@gmail.com',phone:'5434886013821543543', category:'Finance',start:1981,end:2003,date:'21-06-2009'}, {name:'zeeshan',email:'trishabh885@gmail.com',phone:'8864535213', category:'Finance',start:1981,end:2003,date:'21-06-2009'} ] const reducedObject = companies.reduce((acc, current) => { Object.entries(current).forEach(([key, value]) => { // 有对应键就追加值,没有就初始化数组 acc[key] ? acc[key].push(value) : acc[key] = [value] }) return acc }, {}) // 直接把空对象作为reduce的初始累加器,无需额外外部变量 console.log(reducedObject)
优化说明
- 消除了外部变量依赖,不会污染外部作用域,逻辑更纯粹可复用
- 用数组解构简化键值对读取,代码更简洁易读
- 变量命名符合语义,避免歧义
- 时间复杂度和原实现完全一致,没有额外性能损耗,输出结果和原实现完全对齐
内容的提问来源于stack exchange,提问作者rishabh tripathi
相关产品推荐
相关产品推荐

