如何优化多对象合并为结构化对象数组的实现方式?
高效合并多个对象为结构化对象数组的方案
需求背景
现有以下两个对象:
const costsObj = { Honda: 24000, BMW: 55000, Toyota: 22000 }; const stockObj = { Honda: 5, BMW: 1, Toyota: 2 };
需要合并为如下结构的对象数组:
const carsArr = [ {brand: "Honda", cost: 24000, stock: 5}, {brand: "BMW", cost: 55000, stock: 1}, {brand: "Toyota", cost: 22000, stock: 2} ];
当前已有实现方式但较为繁琐,希望找到更高效的方案,尤其支持未来新增更多对象(比如新增model信息)的场景:
const carsArr = [ {brand: "Honda", model: "Accord", cost: 24000, stock: 5}, {brand: "BMW", model: "3 series", cost: 55000, stock: 1}, {brand: "Toyota", model: "Camry", cost: 22000, stock: 2} ];
现有实现(供参考)
// 用costsObj创建初始数组 let carsArr = Object.keys(costsObj).map(brand => { return { brand, cost: costsObj[brand], stock: 0 }; }); // 从stockObj补充数据 for (const [key, value] of Object.entries(stockObj)) { carsArr.forEach((item, index)=>{ if(item.brand == key) { // 注:原代码中item.term应为item.brand,此处修正笔误 carsArr[index].stock = value; } }) };
优化方案
1. 针对两个对象的简化写法
直接在map中一次性获取两个对象的对应值,无需后续循环遍历,时间复杂度从O(n²)降到O(n):
const carsArr = Object.keys(costsObj).map(brand => ({ brand, cost: costsObj[brand], stock: stockObj[brand] ?? 0 // 可选:添加默认值避免不存在的品牌出现undefined }));
2. 支持多对象合并的通用方案
当需要合并更多对象(比如新增modelObj)时,定义字段与源对象的映射关系,核心逻辑无需修改即可扩展:
// 新增的model对象 const modelObj = { Honda: "Accord", BMW: "3 series", Toyota: "Camry" }; // 定义字段映射:目标字段名 -> 对应的源对象 const fieldMap = { cost: costsObj, stock: stockObj, model: modelObj }; // 获取所有品牌(假设所有源对象的key一致,以其中一个为准) const brands = Object.keys(costsObj); // 生成最终数组 const carsArr = brands.map(brand => { const car = { brand }; for (const [field, sourceObj] of Object.entries(fieldMap)) { car[field] = sourceObj[brand] ?? null; // 可根据需求设置默认值 } return car; });
后续新增字段时,只需添加对应源对象并更新fieldMap即可,完全符合开闭原则。
3. 简洁的函数式写法(可选)
用Object.assign和展开语法进一步简化通用方案代码:
const carsArr = brands.map(brand => Object.assign( { brand }, ...Object.entries(fieldMap).map(([field, obj]) => ({ [field]: obj[brand] })) ));
内容的提问来源于stack exchange,提问作者MeltingDog
相关产品推荐
相关产品推荐

