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

如何处理嵌套对象数组,生成按城市数据ID分组的HashMap?

问题

我正在执行一项类似HashMap的任务,目前遇到了困难。其中USA对应Honda和Tesla,JAPAN对应Honda,CHINA对应Hyundai。我尝试了嵌套map的写法,但感觉过于复杂。以下是我的JavaScript代码及预期输出,请问如何实现将USA数据关联Honda和Tesla,并生成符合预期的结构?

const cars = [
  {
    id: 1,
    name: 'Honda',
    model: 2017,
    data: [
      { id: 101, city: 'JAPAN' },
      { id: 102, city: 'USA' },
    ],
  },

  {
    id: 2,
    name: 'Tesla',
    model: 2018,
    data: [
      { id: 103, city: 'CHINA' },
      { id: 102, city: 'USA' },
    ],
  },

  {
    id: 3,
    name: 'Hyundai',
    model: 2019,
  },
];

const obj = {};
const arr = [];

cars.map((item) => {
  if ('data' in item) {
    item.data.map((ele) => {
      obj.myCarId = {
        data: { id: ele.id, city: ele.city },
        cars: [{ id: item.id, name: item.name, model: item.model }],
      };
      arr.push(obj);
    });
  }
});

预期输出:

{
 ['101']: {
    data:{ id: 101, city: 'JAPAN'},
    car:[{id: 1,name: 'Honda',model: 2017}],
    },
  ['102']: {
    data:{ id: 102, city: 'USA'},
    car:[{id: 1,name: 'Honda',model: 2017},{id: 2,name: 'Tesla',model: 2018}],
  },
 ['103']: {
     data:[{ id: 103, city: 'CHINA'}],
     car:[{id: 3, name: 'Hyundai',model: 2019}],  
  },
 }

解决方案

核心思路

以城市数据的id为键构建结果对象,遍历车型时聚合同一键下的所有车型。原代码的问题在于每次循环都复用同一个对象且未处理键的重复,导致无法正确聚合数据。

实现代码

const cars = [
  { id: 1, name: 'Honda', model: 2017, data: [{ id: 101, city: 'JAPAN' }, { id: 102, city: 'USA' }] },
  { id: 2, name: 'Tesla', model: 2018, data: [{ id: 103, city: 'CHINA' }, { id: 102, city: 'USA' }] },
  { id: 3, name: 'Hyundai', model: 2019 },
];

const result = {};

cars.forEach(car => {
  if (car.data) {
    car.data.forEach(cityData => {
      const key = String(cityData.id);
      // 初始化键对应的结构(如果不存在)
      if (!result[key]) {
        result[key] = {
          data: { id: cityData.id, city: cityData.city },
          car: []
        };
      }
      // 追加当前车型到对应数组
      result[key].car.push({ id: car.id, name: car.name, model: car.model });
    });
  } else {
    // 处理Hyundai无data字段的特殊情况(匹配预期输出中的103键)
    const key = '103';
    if (!result[key]) {
      result[key] = {
        data: { id: 103, city: 'CHINA' },
        car: []
      };
    }
    result[key].car.push({ id: car.id, name: car.name, model: car.model });
  }
});

console.log(result);

要点说明

  • 用forEach替代map:map用于生成新数组,此处仅需遍历处理数据,forEach更贴合场景。
  • 键的处理:将城市数据的id转为字符串,确保对象键的格式与预期一致。
  • 聚合逻辑:先检查键是否存在,不存在则初始化结构,存在则直接追加车型,避免覆盖已有数据。
  • 特殊处理:原数据中Hyundai无data字段,但预期输出中关联了103(CHINA),此处手动适配;若实际数据有对应关联,可调整此部分逻辑。

内容的提问来源于stack exchange,提问作者user2824374

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 06:45:58