如何为已筛选的购买客户数组添加对应购买产品名称列表?
实现思路与解决方案
推理思路
- 先把产品列表转换成ID与名称的映射对象,避免每次匹配产品ID都遍历整个产品数组,提升查询效率
- 遍历已筛选出的
customersWhoPurchased数组,为每个客户对象新增productNames字段 - 对每个客户,找到其对应的购买记录集合,提取所有
productId并做去重处理 - 通过映射对象把去重后的产品ID转换成对应的产品名称,最终赋值给
productNames字段
代码实现
步骤1:构建产品ID映射
// 将产品数组转为ID->名称的映射表,优化查询性能 const productMap = data.products.reduce((acc, product) => { acc[product.id] = product.name; return acc; }, {});
步骤2:处理客户数组,添加产品名称字段
const customersWithProducts = customersWhoPurchased.map(customer => { // 找到当前客户对应的购买记录 const customerPurchaseRecord = data.purchases.find(p => p.customerId === customer.id); // 提取所有购买的产品ID并去重 const uniqueProductIds = customerPurchaseRecord ? [...new Set(customerPurchaseRecord.purchases.map(item => item.productId))] : []; // 转换为产品名称数组 const productNames = uniqueProductIds.map(id => productMap[id]); // 返回包含productNames的新客户对象(不修改原对象) return { ...customer, productNames }; });
代码说明
- 产品映射:使用
reduce遍历产品数组,构建以产品ID为键、名称为值的对象,后续通过ID获取名称的操作是O(1)时间复杂度 - 去重逻辑:利用
Set的唯一性特性,快速去除重复的产品ID,再通过扩展运算符转回数组 - 不可变处理:使用对象展开运算符
...复制原客户对象,避免直接修改原数组中的对象,保证数据纯净性
内容的提问来源于stack exchange,提问作者user19031425
相关产品推荐
相关产品推荐

