减少函数 returns 未定义
Reduce function returns undefined
我搜索了以前回答过的问题,但我认为这是一个独家挑战(请原谅我的英语)。
我下面有这个函数,期望 returns 来自回调 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 和 await 的窍门
您不应将 filter
用于 trips
,因为它会改变项目并根据 item.billedAmount
布尔值进行过滤。因此,如果 item.billedAmount
在任何时候是 0
,该项目将从 trips
中删除;
如果要修改项目的值,则必须改用 map
。 return 整个 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
}
我终于想到我必须在 reducer 函数中 return acc
。感谢指导。
我搜索了以前回答过的问题,但我认为这是一个独家挑战(请原谅我的英语)。
我下面有这个函数,期望 returns 来自回调 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.
您不应将 filter
用于 trips
,因为它会改变项目并根据 item.billedAmount
布尔值进行过滤。因此,如果 item.billedAmount
在任何时候是 0
,该项目将从 trips
中删除;
如果要修改项目的值,则必须改用 map
。 return 整个 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
}
我终于想到我必须在 reducer 函数中 return acc
。感谢指导。