Node.js误将数组识别为对象:innarflightInfo函数map调用报错求助
问题:传入数组却被识别为对象,导致map方法调用失败
我确认传给innarflightInfo函数的data应该是数组,但Node.js把它识别成了对象,调用map方法时直接报错。已经用以下代码排查:
console.log(typeof data) console.log(data)
相关截图:

涉及的函数代码:
const innarflightInfo = (data) => { const flightd = [] console.log(typeof data) console.log(data) data?.map((fdata,i) => { // 报错位置 const flight = {} flight.companyId = fdata?.flightInformation?.companyId?.marketingCarrier || '' flight.operatingCarrier = fdata?.flightInformation?.companyId?.operatingCarrier || '' flight.dateOfDeparture = fdata?.flightInformation?.productDateTime?.dateOfDeparture || '' flight.timeOfDeparture = fdata?.flightInformation?.productDateTime?.timeOfDeparture || '' flight.dateOfArrival = fdata?.flightInformation?.productDateTime?.dateOfArrival || '' flight.timeOfArrival = fdata?.flightInformation?.productDateTime?.timeOfArrival || '' flight.from = fdata?.flightInformation?.location[0]?.locationId || '' flight.fromTerminal = fdata?.flightInformation?.location[0]?.terminal || '' flight.to = fdata?.flightInformation?.location[1]?.locationId || '' flight.toTerminal = fdata?.flightInformation?.location[1]?.terminal || '' flight.flightOrtrainNumber = fdata?.flightInformation?.flightOrtrainNumber || '' flight.equipmentType = fdata?.flightInformation?.productDetail?.equipmentType || '' flight.electronicTicketing = fdata?.flightInformation?.addProductDetail?.electronicTicketing || '' flightd.push(flight) }) return flightd } const flightInfo = (data) => { const flights = {} data?.map((fdata,i) => { flights.FlightNo = fdata?.propFlightGrDetail?.flightProposal[0]?.ref || '' flights.flightDetails = innarflightInfo(fdata?.flightDetails) }) console.log(flights) return flights }
原因分析
从终端截图能看到:
typeof data返回object,打印的data结构是带数字索引键的对象(比如{"0": {...}, "1": {...}}),这说明传入的是类数组对象,不是真正的Array实例。- 类数组对象只是外形像数组,但不属于Array类型,所以没有
map等数组原型方法,调用时自然报错。 - 问题出在
flightInfo函数里的innarflightInfo(fdata?.flightDetails),这里的flightDetails大概率是后端返回的类数组结构,或者前端处理时被转换成了对象(比如某些JSON序列化工具会把数组转成带索引的对象)。
解决方案
把类数组对象转换成真正的数组再调用map,常用三种方式:
- 使用
Array.from()转换:
Array.from(data)?.map((fdata,i) => { // 原逻辑代码 })
- 使用展开运算符:
[...data]?.map((fdata,i) => { // 原逻辑代码 })
- 直接调用数组原型的
map方法,绑定类数组对象:
Array.prototype.map.call(data, (fdata,i) => { // 原逻辑代码 })
也可以在调用innarflightInfo之前提前转换,避免函数内部处理:
flights.flightDetails = innarflightInfo(Array.from(fdata?.flightDetails) || [])
内容的提问来源于stack exchange,提问作者Blank
相关产品推荐
相关产品推荐

