如何使用JavaScript将混合主、子地点的对象数组归约为合并后的新对象数组?
实现主地点与子区域合并的技术方案
先明确下需求:我们有一个混合了主地点和对应子区域的数组,需要把每个子区域匹配到对应的主地点中,给主地点新增sub_area字段来关联对应的子地点。
原始输入(未格式化数组)
[ { "name": "main_place1", "address": "place_address1" }, { "name": "main_place2", "address": "place_address2" }, { "name":"sub_main_place1", "address":"sub_main_place_address1" }, { "name":"sub_main_place2", "address":"sub_main_place_address2" } ]
期望输出(格式化后数组)
[ { "name": "main_place1", "address": "place_address1", "sub_area": "sub_main_place1" }, { "name": "main_place2", "address": "place_address2", "sub_area": "sub_main_place2" } ]
技术实现方案(以JavaScript为例)
这里的核心逻辑是匹配主地点和子地点的命名关联(子地点名称是sub_+主地点名称),我们可以按以下步骤实现:
- 先把原始数组拆分成主地点集合和子地点集合
- 遍历主地点集合,根据名称匹配对应的子地点
- 给主地点添加
sub_area字段,关联匹配到的子地点名称
具体代码如下:
const unformattedPlaces = [ { "name": "main_place1", "address": "place_address1" }, { "name": "main_place2", "address": "place_address2" }, { "name":"sub_main_place1", "address":"sub_main_place_address1" }, { "name":"sub_main_place2", "address":"sub_main_place_address2" } ]; // 拆分主地点和子地点 const mainPlaces = unformattedPlaces.filter(place => place.name.startsWith('main_')); const subPlaces = unformattedPlaces.filter(place => place.name.startsWith('sub_')); // 创建子地点的映射表,方便快速查找(键:去掉sub_后的名称,值:子地点名称) const subPlaceMap = subPlaces.reduce((map, subPlace) => { const mainName = subPlace.name.replace('sub_', ''); map[mainName] = subPlace.name; return map; }, {}); // 合并主地点和子区域 const formattedPlaces = mainPlaces.map(mainPlace => ({ ...mainPlace, sub_area: subPlaceMap[mainPlace.name] || null // 处理没有对应子地点的情况 })); console.log(formattedPlaces);
代码逻辑解释
- 用
filter方法拆分主/子地点:通过名称前缀main_和sub_区分两类地点 - 用
reduce创建子地点映射表:把每个子地点的名称去掉sub_后作为键,这样可以快速通过主地点名称找到对应的子地点,提升匹配效率 - 用
map遍历主地点,解构原有属性并新增sub_area字段,从映射表中取出对应的子地点名称,同时做了空值兜底(避免没有匹配到子地点时出现undefined)
如果你的主/子地点命名规则不同,只需要修改replace或者匹配逻辑即可快速适配。
内容的提问来源于stack exchange,提问作者masterblaster
相关产品推荐
相关产品推荐

