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

Object.entries与flatMap处理null值报错及转换需求

问题排查与解决:Object.entries处理null报错及数据转换需求实现

我编写了一个数据转换函数,处理Object.entries和flatMap中的null值时抛出TypeError,错误信息如下:

Object.entries(val).map(([k, v]) => [key + '_' + k, v]) : 
         ^

TypeError: Cannot convert undefined or null to object
    at Function.entries (<anonymous>)
    at Function.<anonymous> (/tmp/puFsbRMXEh.js:6:14)
    at Array.flatMap (<anonymous>)
    at /tmp/puFsbRMXEh.js:3:24
    at Array.map (<anonymous>)
    at transform (/tmp/puFsbRMXEh.js:1:32)
    at Object.<anonymous> (/tmp/puFsbRMXEh.js:95:13)
    at Module._compile (internal/modules/cjs/loader.js:999:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1027:10)
    at Module.load (internal/modules/cjs/loader.js:863:32)

原代码:

const transform = data => data.map(el =>
  Object.fromEntries(
    Object.entries(el).flatMap(
        
      ([key, val]) => val === null ? 
      Object.entries(val).map(([k, v]) => [key + '_' + k, v]) : 
      [[key, val]] ,
    ([key, val]) => val && typeof val === 'object' ? 
      Object.entries(val).map(([k, v]) => [key + '_' + k, v]) : 
      [[key, val]],
      )
    )
  )

const data = [{
    id: '6397f6f46b18bc89cb37053c',
    cost_center: null,
    plant: null,
    material: null
  },
  {
    id: '6397f7166b18bc89cb372ff7',
    cost_center: 'C118as0008',
    short_description: 'LINE PasdNG ALL',
    plant: 'K1as8',
    material: '300006',
    material_name: 'DRILLO PBJ 22g MT (12 pcs x 8 ib)',
    base_quantity: 218.995,
    ZAP_DP: {
      acttyp: 'ZAP_DP',
      stdval: 0.224,
      unit: 'HR'
    },
    ZAP_EL: {
      acttyp: 'ZAP_EL',
      stdval: 0.224,
      unit: 'HR'
    },
    ZAP_LH: {
      acttyp: 'ZAP_LH',
      stdval: 0.224,
      unit: 'HR'
    },
    ZAP_OT: {
      acttyp: 'ZAP_OT',
      stdval: 0.224,
      unit: 'HR'
    },
    kwh: 35.46,
    no_mc_mmbtu: 5,
    noempl: 50
  },
  {
    id: '6397f7166b18bc89cb373003',
    cost_center: 'C11asd9',
    short_description: 'LINE WAasdAT FOX',
    plant: 'K1aas8',
    material: '300007',
    material_name: 'asBAasd0g GT (60 pcs)',
    base_quantity: 28.816,
    ZAP_DP: {
      acttyp: 'ZAP_DP',
      stdval: 0.33,
      unit: 'HR'
    },
    ZAP_EL: {
      acttyp: 'ZAP_EL',
      stdval: 0.33,
      unit: 'HR'
    },
    ZAP_GS: {
      acttyp: 'ZAP_GS',
      stdval: 0.33,
      unit: 'HR'
    },
    ZAP_LH: {
      acttyp: 'ZAP_LH',
      stdval: 0.33,
      unit: 'HR'
    },
    ZAP_OT: {
      acttyp: 'ZAP_OT',
      stdval: 0.33,
      unit: 'HR'
    },
    kwh: 72.67,
    no_mc_mmbtu: 1.85,
    noempl: 14.5
  }
]

console.log(transform(data))

需求:将null值转为空字符串,同时正确展开嵌套对象为key_subkey: value的格式,预期输出示例:

[
  {
    "id": "6397f6f46b18bc89cb37053c",
    "cost_center": "",
    "plant": "",
    "material": ""
  },
  {
    "id": "6397f7166b18bc89cb372ff7",
    "cost_center": "C118as0008",
    "short_description": "LINE PasdNG ALL",
    "plant": "K1as8",
    "material": "300006",
    "material_name": "DRILLO PBJ 22g MT (12 pcs x 8 ib)",
    "base_quantity": 218.995,
    "ZAP_DP_acttyp": "ZAP_DP",
    "ZAP_DP_stdval": 0.224,
    "ZAP_DP_unit": "HR",
    "ZAP_EL_acttyp": "ZAP_EL",
    "ZAP_EL_stdval": 0.224,
    "ZAP_EL_unit": "HR",
    "ZAP_LH_acttyp": "ZAP_LH",
    "ZAP_LH_stdval": 0.224,
    "ZAP_LH_unit": "HR",
    "ZAP_OT_acttyp": "ZAP_OT",
    "ZAP_OT_stdval": 0.224,
    "ZAP_OT_unit": "HR",
    "kwh": 35.46,
    "no_mc_mmbtu": 5,
    "noempl": 50
  },
  ...
]

错误原因分析

  1. flatMap参数错误:flatMap仅接受一个回调函数,原代码传入两个回调导致逻辑混乱,第一个回调中对null值调用Object.entries(val)直接触发报错。
  2. null值处理逻辑错误:当val为null时,错误尝试用Object.entries解析null,而Object.entries不支持null/undefined作为参数。
  3. 对象判断不严谨:typeof null返回'object',原代码的val && typeof val === 'object'会把null误判为对象,需要排除null的情况。

修正后的代码

const transform = data => data.map(el =>
  Object.fromEntries(
    Object.entries(el).flatMap(([key, val]) => {
      // 处理null值,转为空字符串
      if (val === null) {
        return [[key, '']];
      }
      // 处理嵌套对象(排除数组,若需处理数组可调整逻辑)
      if (typeof val === 'object' && val !== null && !Array.isArray(val)) {
        return Object.entries(val).map(([k, v]) => [`${key}_${k}`, v]);
      }
      // 其他情况直接返回原键值对
      return [[key, val]];
    })
  )
);

console.log(transform(data));

代码说明

  • 优先判断val是否为null,直接转为[key, '']的键值对。
  • 判断对象时,增加val !== null和!Array.isArray(val)的校验,确保只处理真正的嵌套对象。
  • 嵌套对象通过Object.entries遍历后,拼接成key_subkey的格式返回,配合flatMap自动展开数组。
  • 所有逻辑合并到flatMap的单个回调中,避免参数错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 17:45:47