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

如何在TypeScript中根据对象属性合并数组的propId值?

TypeScript实现按动态prop合并数组元素

问题描述

现有如下格式的数组:

const example = [
  {
    "prop": "test",
    "propId": [1]
  },
  {
    "prop": "test",
    "propId": [2]
  },
  {
    "prop": "test",
    "propId": [3]
  },
  {
    "prop": "test2",
    "propId": [4]
  },
  {
    "prop": "test2",
    "propId": [5]
  }
];

需要根据prop属性的动态值合并数组元素,将相同prop对应的propId合并为一个数组,期望输出:

const output = [
  {
    "prop": "test",
    "propId": [1, 2, 3]
  },
  {
    "prop": "test2",
    "propId": [4, 5]
  }
];

实现代码

// 定义元素类型约束
interface Item {
  prop: string;
  propId: number[];
}

function mergeByProp(items: Item[]): Item[] {
  // 用Map存储已处理的prop对应的合并结果
  const propMap = new Map<string, Item>();

  for (const item of items) {
    const existing = propMap.get(item.prop);
    if (existing) {
      // 合并已有prop对应的propId数组
      existing.propId = [...existing.propId, ...item.propId];
    } else {
      // 首次遇到该prop,存入Map
      propMap.set(item.prop, { ...item });
    }
  }

  // 将Map中的值转换为目标数组返回
  return Array.from(propMap.values());
}

// 测试示例
const example = [
  { prop: "test", propId: [1] },
  { prop: "test", propId: [2] },
  { prop: "test", propId: [3] },
  { prop: "test2", propId: [4] },
  { prop: "test2", propId: [5] }
];

const output = mergeByProp(example);
console.log(output);

代码说明

  • 用Item接口约束数组元素类型,符合TypeScript的类型安全要求。
  • 使用Map作为中间存储,能兼容任意合法字符串类型的prop值,避免普通对象键的类型限制。
  • 遍历原数组时,对每个元素判断是否已存在对应prop的合并项,存在则合并propId,不存在则新增项。
  • 最后通过Array.from将Map的取值转换为目标格式的数组。

内容的提问来源于stack exchange,提问作者cyro.alves

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 05:30:52