通过 map() 遍历原始数组,利用对象字典按 label 键查找并展开对应属性,即可高效完成结构合并,生成含 price、count 等多维度信息的新数组。
通过 `map()` 遍历原始数组,利用对象字典按 `label` 键查找并展开对应属性,即可高效完成结构合并,生成含 `price`、`count` 等多维度信息的新数组。
在实际前端开发中,常需整合来自多个 API 的异构数据——例如一个接口返回服务类型列表(数组),另一个返回各类型的统计指标(键值对对象)。此时,以公共字段(如 label)为关联依据进行数据融合,是典型且高频的需求。
最简洁、可读性强且性能良好的实现方式是使用 Array.prototype.map() 配合对象展开语法(spread operator):
const data = [
{ label: "Private", price: 5 },
{ label: "VIP", price: 5 }
];
const counts = {
"Private": { count: 34 },
"VIP": { count: 80 }
};
const result = data.map(item => ({ ...item, ...counts[item.label] }));
console.log(result);
// 输出:
// [
// { label: "Private", price: 5, count: 34 },
// { label: "VIP", price: 5, count: 80 }
// ]✅ 优势说明:
- 零副作用:map() 返回新数组,不修改原始数据;
- 语义清晰:一行核心逻辑即完成字段注入;
- 安全可靠:若某 item.label 在 counts 中不存在,counts[item.label] 为 undefined,展开后不添加额外属性(可配合空值合并 ?? {} 进一步增强健壮性)。
⚠️ 注意事项:
- 确保 counts 对象的键与 data 中每个对象的 label 值严格匹配(包括大小写与空格);
- 若存在缺失映射(如 label: "Basic" 但 counts 中无 "Basic"),建议增加容错处理:
const result = data.map(item => ({
...item,
...(counts[item.label] ?? {}) // 若无匹配项,则合并空对象,避免 undefined 展开报错
}));? 进阶提示:
如需支持深层嵌套合并(如 counts 中含 metadata 对象),可替换为 Object.assign() 或使用 Lodash 的 merge();但对本例的扁平结构,解构展开已是最佳实践。
综上,该方案兼顾简洁性、可维护性与运行效率,是现代 JavaScript 数据聚合的推荐范式。

















