基于foodTypeId与id匹配合并对象数组及代码问题排查
数组合并问题修复方案
你的代码没得到预期结果,核心有两个问题:
- 变量名不匹配:示例数组是
arr1和arr2,但代码里用的是arr6和arr7,完全没关联到目标数据 - 属性合并不精准:直接展开整个
obj2会引入冗余字段,还可能覆盖arr1的同名属性(比如两个数组都有seatType)
修正后的基础版本代码
// 先声明结果数组 const mergedArr = []; arr1.forEach(obj1 => { // 匹配arr2中id等于当前对象foodTypeId的项 const matchedFood = arr2.find(item => item.id === obj1.foodTypeId); if (matchedFood) { // 只提取需要的三个字段,避免冗余和属性覆盖 const mergedObj = { ...obj1, foodCategoryDescription: matchedFood.foodCategoryDescription, description: matchedFood.description, fullName: matchedFood.fullName }; mergedArr.push(mergedObj); } else { // 没有匹配项时直接保留原对象副本 mergedArr.push({...obj1}); } });
高性能优化版本(适合大数据量)
如果arr2数据量较大,每次用find遍历会降低性能,建议先把arr2转成以id为键的映射表,后续匹配只需O(1)时间:
// 构建foodType映射表,只保留需要的字段 const foodTypeMap = arr2.reduce((map, item) => { map[item.id] = { foodCategoryDescription: item.foodCategoryDescription, description: item.description, fullName: item.fullName }; return map; }, {}); // 用map遍历arr1,直接匹配映射表数据 const mergedArr = arr1.map(obj1 => { const matchedData = foodTypeMap[obj1.foodTypeId]; // 有匹配项则合并,无则返回原对象副本 return matchedData ? {...obj1, ...matchedData} : {...obj1}; });
测试你的示例数据,运行后每个结果对象都会包含arr1的所有键值对,以及arr2对应的foodCategoryDescription、description、fullName字段。
内容的提问来源于stack exchange,提问作者user21417943
相关产品推荐
相关产品推荐

