You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何按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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 23:15:05