原生JavaScript如何按对象键对万级对象数组做键值分组聚合?
原生JS万级对象数组按键聚合最优实现
方案核心优势
- 时间复杂度仅为O(n),单次遍历即可完成所有聚合操作,万级数据可毫秒级完成计算
- 采用
Set做值存储,插入、去重判断都是O(1)时间复杂度,远优于数组includes的线性查找 - 自动过滤空字符串、null、undefined三类空值,兼容数组内对象键不一致的场景
实现代码
function aggregateFields(arr) { const result = {} // 单次遍历所有记录 for (const item of arr) { // 遍历当前对象的所有自有属性 for (const key in item) { if (!item.hasOwnProperty(key)) continue const value = item[key] // 过滤空值:空字符串、null、undefined if (value == null || value === '') continue // 首次遇到对应键时初始化Set result[key] = result[key] || new Set() result[key].add(value) } } // Set转数组得到最终结果 return Object.fromEntries( Object.entries(result).map(([key, set]) => [key, Array.from(set)]) ) }
测试效果
const data = [ { company: "TATA", car: "TATA Indica", color: "Blue" }, { company: "TATA", car: "TATA Indica", color: "Black" }, { company: "TATA", car: "Safari", color: "Blue" }, { company: "Suzuki", car: "", color: "" } ] console.log(aggregateFields(data)) // 输出符合预期: // { // company: ["TATA", "Suzuki"], // car: ["TATA Indica", "Safari"], // color: ["Blue", "Black"] // }
内容的提问来源于stack exchange,提问作者Ranjith M
相关产品推荐
相关产品推荐

