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

TypeScript按键分组对象:如何合并同键对象的值?

解决方案:合并单键对象数组并处理TypeScript类型

完整实现代码

先定义精准的类型约束,再通过reduce完成合并,同时解决类型检查报错问题:

// 定义原数组元素类型:单键对象,键为`key-数字`格式,值为目标对象
type OriginalItem = { [K in `key-${number}`]: Record<string, unknown> };
// 定义合并后结果类型:键对应原数组的键,值为对应对象的数组
type MergedResult = { [K in `key-${number}`]?: Record<string, unknown>[] };

const original: OriginalItem[] = [
  { "key-8": { "some": "object" } },
  { "key-12": { "some": "object" } },
  { "key-12": { "some": "object" } },
  { "key-1": { "some": "object" } },
  { "key-8": { "some": "object" } }
];

const merged = original.reduce<MergedResult>((acc, item) => {
  // 获取当前对象的唯一键,并断言为我们定义的类型
  const key = Object.keys(item)[0] as `key-${number}`;
  const value = item[key];

  // 合并逻辑:键已存在则追加元素,不存在则初始化数组
  acc[key] ? acc[key].push(value) : (acc[key] = [value]);
  
  return acc;
}, {});

类型问题说明与优化

你之前遇到TypeScript报错的核心原因:

  • Object.keys()默认返回string[],TypeScript无法自动推断出它是key-数字这类特定格式的键
  • 未给累加器acc指定明确类型,导致类型推断模糊

如果你的"some object"有具体结构,可替换为更严格的类型:

// 假设目标对象的明确结构
type TargetObject = { some: string; extraProp?: boolean };
type OriginalItem = { [K in `key-${number}`]: TargetObject };
type MergedResult = { [K in `key-${number}`]?: TargetObject[] };

如果不需要限制键的格式(支持任意键名),可使用通用类型:

type OriginalItem = Record<string, TargetObject>;
type MergedResult = Record<string, TargetObject[]>;

// 此时键的断言改为string即可
const key = Object.keys(item)[0] as string;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 20:54:16