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 }, ... ]
错误原因分析
- flatMap参数错误:
flatMap仅接受一个回调函数,原代码传入两个回调导致逻辑混乱,第一个回调中对null值调用Object.entries(val)直接触发报错。 - null值处理逻辑错误:当
val为null时,错误尝试用Object.entries解析null,而Object.entries不支持null/undefined作为参数。 - 对象判断不严谨:
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
相关产品推荐
相关产品推荐

