如何在JavaScript中将嵌套对象数组转换为带唯一ID的数组并解决重复ID问题?
解决数组转换时的重复ID问题
你的问题出在遍历了每个period下的所有files——因为同一个period对应的hospital信息是完全一致的,而你的代码会把每个file都转换成一条记录,自然就出现了重复的ID(都是同一个period的id)。
根据你备注里说的「每个period仅对应一个hospital_id」,我们根本不需要遍历files数组,只需要从files里取一次hospital相关的字段就行,直接用map处理每个period就可以得到你想要的结果:
解决方案代码
// 假设originalData是你原始的对象 const transformedData = { data: originalData.data.map(period => ({ id: period.id, hospital_name: period.files[0].hospital_name, hospital_id: period.files[0].hospital_id, from: period.from, to: period.to, description: period.description })) };
更健壮的版本(处理files为空的情况)
如果担心某些period的files数组可能为空,可以用可选链操作符做个兜底:
const transformedData = { data: originalData.data.map(period => ({ id: period.id, hospital_name: period.files?.[0]?.hospital_name || '', hospital_id: period.files?.[0]?.hospital_id || null, from: period.from, to: period.to, description: period.description })) };
为什么原来的代码会产生重复?
你之前用了flatMap + files.map的组合:
data.flatMap((period) => period.files.map((file) => ({/* ... */})))
这段代码的逻辑是:对每个period,把它的每个file都转换成一条新记录,再把所有period的记录合并成一个数组。因为同一个period下的files都对应同一个hospital,所以最终就会出现多条id相同的重复记录,这和你想要的「每个period对应一条记录」的需求不符。
内容的提问来源于stack exchange,提问作者smile code
相关产品推荐
相关产品推荐

