JavaScript合并两个对象数组 按Id键去重映射日期字段
两对象数组按唯一
Id关联重组字段实现方案 - 核心逻辑:通过
Id建立全局映射表,分别从两个源数组提取目标字段并重命名,按需转换为指定数组结构,兼容两种输出要求。
生成desiredOutput2(扁平带Id字段结构)
直接运行以下代码即可:
// 构建Id全局映射表,兼容单侧缺失数据的场景 const idMap = new Map(); // 处理startDate数组,提取datePosted并重命名为startDate startDate.forEach(item => { const merged = idMap.get(item.Id) ?? { Id: item.Id }; merged.startDate = item.datePosted; idMap.set(item.Id, merged); }); // 处理endDate数组,提取datePosted并重命名为endDate,合并到对应Id条目 endDate.forEach(item => { const merged = idMap.get(item.Id) ?? { Id: item.Id }; merged.endDate = item.datePosted; idMap.set(item.Id, merged); }); // 转换为目标数组 const desiredOutput2 = Array.from(idMap.values());
生成desiredOutput(Id作为对象键的结构)
在上述idMap基础上修改转换逻辑:
const desiredOutput = Array.from(idMap.entries()).map(([id, val]) => ({ [id]: { startDate: val.startDate, endDate: val.endDate } }));
补充说明
- 用
Map做关联的查询效率高于双层遍历匹配,适合数据量较大的场景 - 自动兼容异常数据:若某Id仅出现在单个源数组中,最终结果会保留已存在的字段,不会丢弃数据
- 自动过滤无关字段:不会将不需要的
name字段带入最终输出
之前使用展开符无法实现的原因:直接展开两个数组得到的合并数组会保留全部原字段,既不会按
Id自动去重合并,也不会自动完成datePosted的字段重命名,必须先完成映射关联和字段提取步骤。
内容的提问来源于stack exchange,提问作者JamMan9
相关产品推荐
相关产品推荐

