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

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,常用三种方式:

  1. 使用Array.from()转换:
Array.from(data)?.map((fdata,i) => {
    // 原逻辑代码
})
  1. 使用展开运算符:
[...data]?.map((fdata,i) => {
    // 原逻辑代码
})
  1. 直接调用数组原型的map方法,绑定类数组对象:
Array.prototype.map.call(data, (fdata,i) => {
    // 原逻辑代码
})

也可以在调用innarflightInfo之前提前转换,避免函数内部处理:

flights.flightDetails = innarflightInfo(Array.from(fdata?.flightDetails) || [])

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 04:06:19