TypeScript中JSON转数组结果不一致的问题排查
解决TypeScript转换扫描器数据为数组时结果不一致的问题
看起来你遇到的问题主要来自两个方面:原数据中存在null值的扫描器,以及可能的原型链属性干扰,导致转换后的数组项结构或内容不一致。下面一步步分析并给出解决方案:
问题原因
- null值处理不当:你的原数据里很多扫描器(比如
agnitum、avg)的值是null,当你用...this.value[key]展开null时,JavaScript会将其解析为空对象,最终这些项只会包含scannerName字段,和有有效数据的项结构完全不一致。 - 原型链属性可能被遍历:虽然
Object.keys默认不会返回原型链上的属性,但你的原数据末尾有__proto__: Object,如果这个属性被设置为可枚举(某些特殊场景下可能发生),会被包含到遍历结果里,引入无效项。 - 不必要的重复赋值:
this.completed = true放在map循环里会被执行多次,虽然最终结果是对的,但属于冗余操作。
解决方案
方案1:过滤掉无效的null扫描器(推荐)
如果不需要保留那些没有扫描数据的项,可以先过滤掉值为null的键,确保数组里的每一项结构都一致:
// 先过滤无效项,再转换为数组 this.value.scans = Object.keys(this.value) // 排除原型链属性(保险起见) .filter(key => key !== '__proto__') // 过滤值为null的扫描器 .filter(key => this.value[key] !== null) // 转换为包含扫描器名称的对象 .map(key => ({ ...this.value[key], scannerName: key })); // 最后统一设置完成状态 this.completed = true;
方案2:保留所有扫描器,给null项设置默认值
如果需要保留所有扫描器的记录,哪怕没有数据,可以给null的项设置默认属性,保证结构统一:
this.value.scans = Object.keys(this.value) .filter(key => key !== '__proto__') .map(key => { // 给null数据设置默认值 const defaultScannerData = { scan_time: 0, def_time: "", scan_result_i: 0, threat_found: "" }; const scannerData = this.value[key] ?? defaultScannerData; return { ...scannerData, scannerName: key }; }); this.completed = true;
额外说明
- 关于遍历顺序:ES6规范定义了对象键的遍历顺序,但如果你的运行环境比较旧,可能会有顺序不一致的情况。如果需要严格固定顺序,可以在过滤后手动排序,比如按扫描器名称排序:
.sort((a, b) => a.scannerName.localeCompare(b.scannerName)) - 如果你使用的是ES2020+,
??空值合并运算符可以安全地处理null和undefined;如果环境不支持,可以替换为||(但要注意0或空字符串等假值的情况)。
内容的提问来源于stack exchange,提问作者techno
相关产品推荐
相关产品推荐

