TypeScript对象解析转换结果不符预期,求排查问题
给定如下对象:
{"key1":{"cluster_region":"centralus"},"key2":{"cluster_region":"westeurope"}}
需要将其转换为对象数组,每个对象包含index和region字段:index为原对象的键(如key1、key2),region为对应cluster_region的值。
尝试了以下TypeScript代码:
const allrecords: Record<string, { cluster_region: string }> = initialObject; console.log("all records: " + JSON.stringify(allrecords)); const allList = Object.entries(allrecords).map(([key, value]) => ({ index: key, region: value.cluster_region }));
控制台中allrecords显示正确,但生成的数组结果为:
[{"index":"0"},{"index":"1"},{"index":"2"} ... ]
请问哪里出错了?
你的代码逻辑本身是正确的,如果initialObject确实是你给出的键值对结构,运行后应该得到预期的数组结果。出现当前错误的核心原因是你实际传入的initialObject并非目标键值对对象,而是一个数组。
具体验证与修正:
确认
initialObject的真实结构
如果initialObject是数组(比如后端返回的是[{cluster_region: 'xxx'}, ...]),那么Object.entries()会把数组的索引(0、1、2...)作为key,若数组元素结构不符合预期,就会导致region字段缺失,只剩下index为数组索引的结果。针对不同场景的修正代码
场景1:
initialObject确实是目标键值对对象
你的代码无需修改,检查是否有其他代码提前修改了initialObject的结构(比如误将其转为数组)。此时运行代码应该得到预期结果:[{"index":"key1","region":"centralus"},{"index":"key2","region":"westeurope"}]场景2:
initialObject实际是对象数组
如果原数据是数组形式,直接使用数组的map方法,利用第二个参数获取索引:// 假设initialObject为:[{cluster_region: "centralus"}, {cluster_region: "westeurope"}] const allrecords: Array<{ cluster_region: string }> = initialObject; const allList = allrecords.map((item, idx) => ({ index: `key${idx + 1}`, // 按需求生成类似key1、key2的索引,或直接用数字idx region: item.cluster_region }));
额外排查点
用console.log(typeof allrecords, Array.isArray(allrecords))确认allrecords的真实类型,排查是否是表面显示正确但实际结构异常的类数组对象。
内容的提问来源于stack exchange,提问作者CodeMonkey

