You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 07:25:26