Javascript Reduce函数返回未定义的
我已经搜索了以前回答过的问题,但我认为这是一个排他性的挑战(请原谅我的英语) 我下面有一个函数,它期望从回调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
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}```