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

TypeScript中JSON转数组结果不一致的问题排查

解决TypeScript转换扫描器数据为数组时结果不一致的问题

看起来你遇到的问题主要来自两个方面:原数据中存在null值的扫描器,以及可能的原型链属性干扰,导致转换后的数组项结构或内容不一致。下面一步步分析并给出解决方案:

问题原因

  1. null值处理不当:你的原数据里很多扫描器(比如agnitum、avg)的值是null,当你用...this.value[key]展开null时,JavaScript会将其解析为空对象,最终这些项只会包含scannerName字段,和有有效数据的项结构完全不一致。
  2. 原型链属性可能被遍历:虽然Object.keys默认不会返回原型链上的属性,但你的原数据末尾有__proto__: Object,如果这个属性被设置为可枚举(某些特殊场景下可能发生),会被包含到遍历结果里,引入无效项。
  3. 不必要的重复赋值: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 13:47:59