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

