在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
相关产品推荐
相关产品推荐

