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

在TypeScript中如何基于现有Record类型数据生成新的Record结构?

初始写法问题排查

你最初的写法无法得到预期的Record对象,是因为Array.map()的返回结果是数组,而不是对象结构。如果只是要对单个Record做同结构转换,用Object.fromEntries包裹转换后的键值对数组即可:

const data: Record<string, string> = { "test": "Test", "test2": "Test2"}
const result: Record<string, string> = Object.fromEntries(
  Object.keys(data).map(i => [i, data[i]])
)

多Record合并为Record<string, string[]>实现

针对你补充的合并两个Record<string, CustomType>、按相同key聚合id为数组的需求,实现方案如下:
首先先定义依赖的类型:

type CustomType = {
  id: string
}
const data: Record<string, CustomType> = { "Option 1": {"id": "123"}, "Option 2": {"id": "987"}}
const data_two: Record<string, CustomType> = { "Option 1": {"id": "567"}, "Option 2": {"id": "376"}}

基础实现(固定两个输入源)

// 收集两个输入对象的所有唯一key,避免某个对象缺失key导致遗漏
const allKeys = Array.from(new Set([...Object.keys(data), ...Object.keys(data_two)]))
const result: Record<string, string[]> = Object.fromEntries(
  allKeys.map(key => {
    const idList: string[] = []
    if (data[key]) idList.push(data[key].id)
    if (data_two[key]) idList.push(data_two[key].id)
    return [key, idList]
  })
)

通用封装(支持任意数量输入源)

如果后续需要合并更多同类型的Record,可以封装为通用方法:

function mergeIdRecords<T extends { id: string }>(...records: Record<string, T>[]): Record<string, string[]> {
  const allKeys = Array.from(new Set(records.flatMap(item => Object.keys(item))))
  return Object.fromEntries(
    allKeys.map(key => [
      key,
      records.map(record => record[key]?.id).filter(Boolean) as string[]
    ])
  )
}

// 调用示例
const result = mergeIdRecords(data, data_two)

最终得到的result结构和你预期的完全一致:

{ "Option 1": ["123", "567"], "Option 2": ["987", "376"] }

内容的提问来源于stack exchange,提问作者AGZ

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.19 17:06:04