为了账号安全,请及时绑定邮箱和手机立即绑定

Reduce 函数返回未定义

Reduce 函数返回未定义

江户川乱折腾 2021-11-18 16:02:24
我已经搜索了以前回答过的问题,但我认为这是一个独家挑战(请原谅我的英语)。我在下面有这个函数,期望从回调减少函数返回const { getTrips } = require('api');const { getDriver } = require('api')const { getVehicle } = require('api')/** * This function should return the data for drivers in the specified format * * Question 4 * * @returns {any} Driver report data */let trips = await getTrips().then(data => {  return data.filter(item => item.billedAmount = parseFloat(item.billedAmount.toString().replace(',', '')), 10)})async function driverReport() {  // Your code goes here  let getId = trips.reduce((acc, cur)=>{    acc[cur.driverID] ? acc[cur.driverID] = acc[cur.driverID] + 1 : acc[cur.driverID] = 1    return acc  }, {})  let mapId = Object.keys(getId)  // console.log(mapId)  let result = await mapId.reduce(getReport, {})  console.log(result)//undefined}回调函数如下async function getReport(acc, cur){  acc = await acc  // console.log(acc)  let singleTrip = trips.filter(item => item.driverID == cur)  // console.log(singleTrip)  if(singleTrip){    return getDriver(cur).then( async data => {      let { name, phone, vehicleID } = data      acc['fullName'] = name      acc['id'] = cur      acc['phone'] = phone      acc['noOfTrips'] = singleTrip.length      acc['noOfVehicle'] = vehicleID.length      return acc    }).catch(err =>{      if(err){                console.log ('wait')      }    })  }  return acc}回调函数正常工作,但没有将值返回到上面的结果变量。我已经彻底检查并确认我使用return得当,但我肯定在某个地方弄错了。请帮助找出哪里出错了,因为我正试图掌握在 Javascript 中使用 async 和 await 的窍门。
查看完整描述

2 回答

?
杨魅力

TA贡献1811条经验 获得超6个赞

您不应该使用filterfor,trips因为它正在改变项目并根据item.billedAmount布尔值进行过滤。因此,如果item.billedAmount是0在任何时候,该项目将从中删除trips;map如果要修改项目的值,则必须改用。item变异后返回整个而不是更新对象内的值并将变异作为值返回


let trips = await getTrips().then(data => {

  return data.map(item => {

    item.billedAmount = parseFloat(item.billedAmount.toString().replace(',', ''));

    return item;

   })

 });

编辑 至于问题,试试这个?


async function getReport(acc, cur){  

  let singleTrip = trips.filter(item => item.driverID == cur)

  if(singleTrip && singleTrip.length) { //filter returns empty array

    try{

     data = await getDriver(cur);

     let { name, phone, vehicleID } = data;

     acc {

       fullName: name,

       id: cur,

       phone,

       noOfTrips: singleTrip.length,

       noOfVehicle: vehicleID.length

     }

    }catch(e) {

      console.log(err);

    }

  }

  return acc

}


查看完整回答
反对 回复 2021-11-18
?
GCT1015

TA贡献1827条经验 获得超4个赞

我终于想到我必须返回acc到 reducer 函数中。感谢您的指导。


查看完整回答
反对 回复 2021-11-18
  • 2 回答
  • 0 关注
  • 169 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信