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

Angular中将字符串数组分割为键值对并按公共键分组实现问题

问题原因

你原有代码的问题是每次调用Map.set时直接覆盖对应键的已有值,没有将同个键的多个值收集为数组,导致每个键最终只会保留最后一次存入的内容。


可行实现方案

方案1:输出普通对象(匹配你给出的预期输出格式)

const inputObject = {
  'employees': [
    'bob/january',
    'bob/january-february',
    'bob/january-march',
    'steve/january',
    'steve/january-february',
    'steve/january-march',
    'september',
  ],
};

const outputObject: Record<string, string[] | string> = {};

inputObject.employees.forEach(item => {
  const splitRes = item.split('/');
  // 存在/分隔符的情况
  if (splitRes.length === 2) {
    const key = splitRes[0];
    const val = splitRes[1];
    // 键不存在时先初始化为空数组
    if (!outputObject[key]) {
      outputObject[key] = [];
    }
    (outputObject[key] as string[]).push(val);
  } else {
    // 无分隔符的情况存入n/a
    outputObject['n/a'] = item;
  }
});

执行后outputObject的结构和你给出的预期输出完全一致。


方案2:全数组统一格式(更推荐)

为了避免后续处理时需要判断值是字符串还是数组,建议统一所有键对应的值都是数组格式,实现代码如下:

const outputObject: Record<string, string[]> = {};

inputObject.employees.forEach(item => {
  const splitRes = item.split('/');
  const key = splitRes.length === 2 ? splitRes[0] : 'n/a';
  const val = splitRes.length === 2 ? splitRes[1] : item;
  
  if (!outputObject[key]) {
    outputObject[key] = [];
  }
  outputObject[key].push(val);
});

该版本输出的n/a对应的值为['september'],类型统一,后续遍历、取值逻辑更简单。


方案3:Map结构版本

如果你需要使用Map存储,逻辑和普通对象版本一致:

const outputMap = new Map<string, string[] | string>();

inputObject.employees.forEach(item => {
  const splitRes = item.split('/');
  if (splitRes.length === 2) {
    const key = splitRes[0];
    const val = splitRes[1];
    if (!outputMap.has(key)) {
      outputMap.set(key, []);
    }
    (outputMap.get(key) as string[]).push(val);
  } else {
    outputMap.set('n/a', item);
  }
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 15:06:03