Функция Reduce возвращает неопределенное значение - PullRequest
1 голос
/ 12 октября 2019

Я искал ранее отвеченные вопросы, но я думаю, что это эксклюзивный вызов (простите за мой английский).

У меня есть эта функция ниже, которая ожидает возврата от функции сокращения обратного вызова

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 соответственно, но я уверен, что где-то неправильно. Пожалуйста, помогите выяснить, где я ошибаюсь, поскольку я пытаюсь научиться использовать async и ждать в Javascript.

Ответы [ 2 ]

0 голосов
/ 12 октября 2019

Я наконец понял, что должен вернуть acc внутри функции редуктора. Спасибо за руководство.

0 голосов
/ 12 октября 2019

Вы не должны использовать filter для 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
}
...