如何处理嵌套对象数组,生成按城市数据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
相关产品推荐
相关产品推荐

