Javascript Reduce函数返回未定义的

Javascript Reduce函数返回未定义的,javascript,async-await,es6-promise,Javascript,Async Await,Es6 Promise,我已经搜索了以前回答过的问题,但我认为这是一个排他性的挑战(请原谅我的英语) 我下面有一个函数,它期望从回调reduce函数返回 const { getTrips } = require('api'); const { getDriver } = require('api') const { getVehicle } = require('api') /** * This function should return the data for drivers in the specified

我已经搜索了以前回答过的问题,但我认为这是一个排他性的挑战(请原谅我的英语)

我下面有一个函数,它期望从回调reduce函数返回

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和Wait的诀窍时的错误所在。

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

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
}

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

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
}

我最终决定必须在reducer函数中返回
acc
。感谢您的指导。

我终于想到我必须在减速器功能中返回
acc
。感谢您的指导。

trips不是空的,因为
filter
返回预期的数组<另一方面,code>map
只返回我操作的
项的
值。biledamount
。答案中上面的代码应该返回整个项您不应该使用过滤器,因为它实际上返回了副作用。这样想,每个项都会由过滤器内的函数进行变异,只要item.biledamount不是
0
,它就会向过滤器返回一个非零值,从而将该项保留在数组内。但是它在逻辑上是不正确的,当parseFloat()返回零时,它也可能在运行时导致错误的值。像上面那样使用映射,不要直接映射
item=>item.biledamount=…
谢谢您的解释。我只是这样做了,但仍然和下图一样,我只是尝试了第二个建议,但仍然不起作用。我需要捕获getDriver promise函数中的错误,因此我使用了如下代码``if(singleTrip&&singleTrip.length){return getDriver(cur).then(async data=>{let{name,phone,vehicleID}=data acc={fullName:name,id:cur,phone,noOfTrips:singleTrip.length,noOfVehicle:vehicleID.length}return acc}.catch(err=>{})return acc}``trips不是空的,因为
filter
返回预期的数组<另一方面,code>map
只返回我操作的
项的
值。biledamount
。答案中上面的代码应该返回整个项您不应该使用过滤器,因为它实际上返回了副作用。这样想,每个项都会由过滤器内的函数进行变异,只要item.biledamount不是
0
,它就会向过滤器返回一个非零值,从而将该项保留在数组内。但是它在逻辑上是不正确的,当parseFloat()返回零时,它也可能在运行时导致错误的值。像上面那样使用映射,不要直接映射
item=>item.biledamount=…
谢谢您的解释。我只是这样做了,但仍然和下图一样,我只是尝试了第二个建议,但仍然不起作用。我需要捕获getDriver promise函数中的错误,因此我使用了如下代码``if(singleTrip&&singleTrip.length){return getDriver(cur).then(async data=>{let{name,phone,vehicleID}=data acc={fullName:name,id:cur,phone,noOfTrips:singleTrip.length,noOfVehicle:vehicleID.length}返回acc}).catch(err=>{}返回acc}```