如何在JavaScript/TypeScript中优雅合并带条件的FareZone对象数组
实现方案
可以借助Map做分组聚合、Set做站点去重,逻辑简洁性能优异,完整实现如下:
interface Stop { code: string } interface FareZone { name: string; stops: Stop[]; } const outbound: FareZone[] = [{name: 'Zone A', stops: [{ code: 'C00'}] }, {name: 'Zone B', stops: [{ code: 'C01'}, { code: 'C02'}] }]; const inbound: FareZone[] = [{name: 'Zone A', stops: [{ code: 'C00'}, { code: 'C04'}] }, {name: 'Zone C', stops: [{ code: 'C08'}] }]; // 核心合并逻辑 const zoneGroup = new Map<string, Set<string>>(); [...outbound, ...inbound].forEach(zone => { const stopCodes = zoneGroup.get(zone.name) || new Set(); zone.stops.forEach(stop => stopCodes.add(stop.code)); zoneGroup.set(zone.name, stopCodes); }); const combined: FareZone[] = Array.from(zoneGroup, ([name, codes]) => ({ name, stops: Array.from(codes, code => ({ code })) }));
逻辑说明
- 先将两个待合并数组合并后遍历,用
Map以票价区名称为key做分组,value用Set存储站点编码,自动实现重复站点的去重 - 最后将
Map结构转换回要求的FareZone数组格式即可 - 整体时间复杂度为O(n)(n为所有站点总数量),性能远高于多次遍历筛选的实现
内容的提问来源于stack exchange,提问作者J86
相关产品推荐
相关产品推荐

