API返回JSON的item类型不一致,如何统一转为数组处理?
问题描述
API返回的JSON存在类型不一致问题:
- 当
item包含多条记录时,它是数组类型:
data = `{"serialNo": "1","items":{"item":[{"RECORDNO": "2", "amount": 40},{"RECORDNO": "3","amount": 40}]}}`
- 当
item只有一条记录时,它是对象类型:
data = `{"serialNo": "2","items":{"item":{"RECORDNO": "4841","amount": 40}}}`
现有处理代码在多记录场景下正常,但单记录时会因item不是数组而执行失败:
const vals = [data.items.item][0]; vals.forEach(val => { // do something });
请问最简单的将item提取为数组以便后续处理的方法是什么?
解决方法
以下是几种简洁高效的处理方式,能统一把item转为数组:
方法1:类型判断后统一格式
先检查item是否为数组,非数组则包装成数组:
const item = data.items.item; const vals = Array.isArray(item) ? item : [item]; vals.forEach(val => { // 执行你的逻辑 });
方法2:利用Array.concat的特性(最简洁)
Array.concat()方法既可以接收数组,也可以接收单个值,会自动把单个值转为数组元素:
const vals = [].concat(data.items.item); vals.forEach(val => { // 执行你的逻辑 });
不管item是数组还是单个对象,这个方法都会返回一个标准数组,代码量最少。
方法3:兼容item不存在的场景
如果API可能返回items或item不存在的情况,可以结合可选链和空值合并运算符,避免报错:
const vals = [].concat(data.items?.item ?? []); vals.forEach(val => { // 执行你的逻辑 });
这样即使items或item不存在,也能得到一个空数组,保证后续forEach能正常执行。
内容的提问来源于stack exchange,提问作者Valkyrie
相关产品推荐
相关产品推荐

