简体   繁体   中英

Filter data in Node.js

I want to subtract already booked data from totalSpots variable whenever this condition returns true

if(totalSpots > bookings.count()){
return true
}
return false

And when it return true I want to store it into a variable called filteredData. GET route to fetch parking availability:

exports.getParkingListByCriteria = async (req, res) => {
  try {
    endTime = getEndTime(req.body.startTime, req.body.duration);
    let parkings = await Parking.find(
      {
        "location.city": req.body.city,
      }
    );

    let parkingList = [];
    let parkingIds = [];
    parkings.forEach((parking) => {
      isParkingAvailable(parking.availability, req.body.startTime, endTime);
      {
        parkingList.push(parking);
        parkingIds.push(parking._id);
      }
    });

    const bookings = await Booking.find({
      "isBookingCancelled.value": false,
      parkingId: { $in: parkingIds },
    });

    let groupBookings = {};
    let tmppid = "";
    bookings.forEach((booking) => {
      tmppid = booking.parkingId.toString();
      if (typeof groupBookings[tmppid] === "undefined")
        groupBookings[tmppid] = [];
      groupBookings[tmppid].push(booking);
    });

    var keys = Object.keys(groupBookings);
    console.log("parkingList -> ", parkingList);

    parkingList.filter((booking) => {
      isParkingSlotAvailable(groupBookings, Object.keys(groupBookings));
    }); //Stuck in the function

    res.status(200).send(parkingList);
  } catch (error) {
    return res.status(500).json({ error: error.message });
  }
};

isParkingSlotAvailable Function:

exports.isParkingSlotAvailable = (groupBookings, keys) => {
  groupBookings.forEach((booking) => {});
};

The sample data from console.log(parkingList)

    parkingList ->  [
      {
        contactInfo: { name: 'Claudia Shields', phoneNumber: 8904672101 },
        location: {
          address: '737 applegate court',
          city: 'bowie',
          state: 'rhode island',
          country: 'greece',
          zipCode: 10825
        },
        coordinates: { lng: 34.048954, lat: 10.299556 },
        _id: new ObjectId("62d12053cb03235286511d54"),
        merchantId: new ObjectId("62c950dfc96c2b690028be88"),
        price: 16,
        parkingType: 'residence',
        parkingInfo: [ [Object] ],
        totalSpots: [ 127 ],
        status: 'active',
        isFeePaid: false,
        parkingZone: [],
        availability: [ [Object], [Object], [Object], [Object], [Object], [Object] ],
        specialEvents: [],
        createdAt: 2022-07-15T08:07:47.997Z,
        updatedAt: 2022-07-15T09:29:58.696Z,
        __v: 0
      },
]

The sample data from console.log(groupBookings)

groupBookings:  {
  '62d12053cb03235286511d54': [
    {
      duration: [Object],
      isBookingCancelled: [Object],
      _id: new ObjectId("62d2a9d1cf93195bef1923af"),
      parkingId: new ObjectId("62d12053cb03235286511d54"),
      user: new ObjectId("62c95116c96c2b690028be8e"),
      date: 2022-07-22T00:00:00.000Z,
      startTime: 2022-07-22T05:30:00.000Z,
      endTime: 2022-07-22T08:40:00.000Z,
      isFeePaid: false,
      status: 'sent',
      isStarted: false,
      isEnabled: false,
      createdAt: 2022-07-16T12:06:42.002Z,
      updatedAt: 2022-07-16T12:15:08.578Z,
      __v: 0
    },
    {
      duration: [Object],
      isBookingCancelled: [Object],
      _id: new ObjectId("62d553f80e8fa13f1295514c"),
      parkingId: new ObjectId("62d12053cb03235286511d54"),
      user: new ObjectId("62c95136c96c2b690028be9a"),
      date: 2022-07-22T00:00:00.000Z,
      startTime: 2022-07-22T10:30:00.000Z,
      endTime: 2022-07-22T12:30:00.000Z,
      isFeePaid: false,
      status: 'sent',
      isStarted: false,
      isEnabled: false,
      createdAt: 2022-07-18T12:37:12.682Z,
      updatedAt: 2022-07-18T12:37:12.682Z,
      __v: 0
    }
  ]
}

Try to change your filter function like this.
Also, make sure that you update the parkingList since filter does not edit the array in-place.

parkingList = parkingList.filter((booking) => {
    const booked = groupBookings[booking._id];
    const alreadyBooked = booked ? booked.length : 0;
    return booking.totalSpots[0] > alreadyBooked;
  });

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM