如何按UID匹配两个对象数组,用参考数组属性覆盖目标数组的value值
问题解答
原有实现的优化建议
你原来的写法功能上可正常运行,但存在两个可优化的点:
- 性能问题:每次
map遍历都调用find检索refTiles,时间复杂度为O(n*m),两个数组元素量较大时效率会明显降低 - 边界异常:如果某个uid在refTiles中找不到匹配项,
refObj会返回undefined,直接取refObj["counts"]会抛出类型错误
建议先把refTiles转换成以uid为key的映射表,优化查找效率同时补充兜底逻辑:
// 先构建映射表,时间复杂度O(m) const refMap = new Map(refTiles.map(item => [item.uid, item.counts])) const tiles = streamingTiles.map(item => ({ ...item, // 匹配不到时保留原值,避免报错 value: refMap.get(item.uid) ?? item.value }))
refTiles属性更名后的适配方案
如果把refTiles里的counts改为value,只需调整映射表的取值字段即可,整体处理逻辑可以完全沿用:
const refMap = new Map(refTiles.map(item => [item.uid, item.value])) const tiles = streamingTiles.map(item => ({ ...item, value: refMap.get(item.uid) ?? item.value }))
如果需要同时适配两种属性命名场景,可以把要提取的ref属性名封装为参数,实现通用处理:
function mergeTileValue(streamingTiles, refTiles, refField = 'counts') { const refMap = new Map(refTiles.map(item => [item.uid, item[refField]])) return streamingTiles.map(item => ({ ...item, value: refMap.get(item.uid) ?? item.value })) } // 原counts场景调用 const tiles1 = mergeTileValue(streamingTiles, refTiles) // 更名后value场景调用 const tiles2 = mergeTileValue(streamingTiles, refTiles, 'value')
内容的提问来源于stack exchange,提问作者JokerMartini
相关产品推荐
相关产品推荐

