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

TypeScript中如何将字典列表转换为目标格式的字典?

问题:将字典列表转换为含重复键的对象失败

给定如下字典列表:

const fieldMappings = [
  { "fieldName": "message", "fieldValue": "message123" },
  { "fieldName": "time", "fieldValue": "2023-02-01T10:50:30.603Z" },
  { "fieldName": "hostname", "fieldValue": "host1" },
  { "fieldName": "destination", "fieldValue": "45.84.0.11" },
  { "fieldName": "message", "fieldValue": "message123" },
  { "fieldName": "time", "fieldValue": "2023-02-01T10:50:30.603Z" },
  { "fieldName": "hostname", "fieldValue": "host2" },
  { "fieldName": "destination", "fieldValue": "218.92.0.221" }
];

想要转换为如下格式的fieldData:

fieldData= {
  "message": 'message123', 
  "time": '2023-02-01T10:50:30.603Z', 
  "hostname": 'host1', 
  "destination": '45.84.0.11',
  "message": 'message123', 
  "time": '2023-02-01T10:50:30.603Z', 
  "hostname": 'host2', 
  "destination": '218.92.0.221'
} 

尝试了以下TypeScript代码:

let fieldData: any = {};
fieldMappings.forEach((field) => {
  fieldData[field.fieldName] = field.fieldValue;
});

但得到的输出是后面的键覆盖了前面的:

fieldData={
  "message": 'message123', 
  "time": '2023-02-01T10:50:30.603Z', 
  "hostname": 'host2', 
  "destination": '218.92.0.221'
}

请问如何实现目标格式的转换?

解决方案

首先必须明确:JavaScript/TypeScript的对象不允许存在重复键,语法上即使写了重复键,运行时后面的键值对也会直接覆盖前面的,所以你想要的那种包含重复键的对象是无法实现的,这属于语言本身的限制。

根据你的需求,这里提供两种合理的替代方案:

方案1:将每组数据封装为对象,存入数组

你的原始数据是每4个字段为一组(message、time、hostname、destination),可以把每组数据转换为一个独立对象,最终得到对象数组:

const fieldMappings = [
  { "fieldName": "message", "fieldValue": "message123" },
  { "fieldName": "time", "fieldValue": "2023-02-01T10:50:30.603Z" },
  { "fieldName": "hostname", "fieldValue": "host1" },
  { "fieldName": "destination", "fieldValue": "45.84.0.11" },
  { "fieldName": "message", "fieldValue": "message123" },
  { "fieldName": "time", "fieldValue": "2023-02-01T10:50:30.603Z" },
  { "fieldName": "hostname", "fieldValue": "host2" },
  { "fieldName": "destination", "fieldValue": "218.92.0.221" }
];

const fieldDataArray: Record<string, string>[] = [];
// 每4个元素为一组处理
for (let i = 0; i < fieldMappings.length; i += 4) {
  const group = fieldMappings.slice(i, i + 4);
  const item: Record<string, string> = {};
  group.forEach(field => {
    item[field.fieldName] = field.fieldValue;
  });
  fieldDataArray.push(item);
}

console.log(fieldDataArray);

输出结果:

[
  {
    "message": "message123",
    "time": "2023-02-01T10:50:30.603Z",
    "hostname": "host1",
    "destination": "45.84.0.11"
  },
  {
    "message": "message123",
    "time": "2023-02-01T10:50:30.603Z",
    "hostname": "host2",
    "destination": "218.92.0.221"
  }
]

方案2:将每个字段的所有值收集为数组

如果需要把相同字段名的值聚合起来,可以让每个键对应一个数组:

const fieldMappings = [
  { "fieldName": "message", "fieldValue": "message123" },
  { "fieldName": "time", "fieldValue": "2023-02-01T10:50:30.603Z" },
  { "fieldName": "hostname", "fieldValue": "host1" },
  { "fieldName": "destination", "fieldValue": "45.84.0.11" },
  { "fieldName": "message", "fieldValue": "message123" },
  { "fieldName": "time", "fieldValue": "2023-02-01T10:50:30.603Z" },
  { "fieldName": "hostname", "fieldValue": "host2" },
  { "fieldName": "destination", "fieldValue": "218.92.0.221" }
];

const fieldData: Record<string, string[]> = {};
fieldMappings.forEach(field => {
  if (!fieldData[field.fieldName]) {
    fieldData[field.fieldName] = [];
  }
  fieldData[field.fieldName].push(field.fieldValue);
});

console.log(fieldData);

输出结果:

{
  "message": ["message123", "message123"],
  "time": ["2023-02-01T10:50:30.603Z", "2023-02-01T10:50:30.603Z"],
  "hostname": ["host1", "host2"],
  "destination": ["45.84.0.11", "218.92.0.221"]
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 09:05:14