Фильтровать массив объектов, если значение свойства существует в другом массиве объектов swift - PullRequest
0 голосов
/ 20 февраля 2019

У меня есть два массива объектов, которые выглядят так:

MeetingRoomSuggestions:

init(suggestionReason: String, organizerAvailability: String,
startTime: String, endTime: String, dStart: Date, availability: String,
emailAddress: String, displayName: String, roomEmail: String,
occupancy: Int, building: String)

и Bookings:

init(startTime: String, endTime: String, dStart: Date, organizer :
String, location : String, subject : String)

Я хочубыть в состоянии фильтровать / исключать MeetingRoomSuggestion объекты из моего массива, если свойство dStart существует в массиве Bookings.

Мой код:

  let filteredArr = meetingRoomSuggestions.filter { meeting in
        return bookingArray!.contains(where: { booking in
            return booking.dStart == meeting.dStart
        })
    }

Я также пытался отфильтроватьСтартовая строка - которая одинакова в обоих.Когда я распечатываю оба массива перед фильтрацией - вы можете ясно видеть, что существует резервирование с тем же dStart.Как я могу исключить это?

После фильтрации и печати с использованием кода:

print("meetings:")
        for meeting in self.meetingRoomSuggestions {
            print(meeting.roomEmail)
            print(meeting.dStart)
            print(meeting.startTime)
        }
        print()
        print("bookings:")
        for booking in self.bookingArray! {
            print(booking.location)
            print(booking.dStart!)
            print(booking.start)
        }            

        print("filtered array: ", filteredArr)

        for items in filteredArr {
            print("email: ", items.roomEmail)
            print("dstart: ", items.dStart)
        }

Возвращает:

    meetings:
FirstFloorTestMeetingRoom1@qubbook.onmicrosoft.com
2019-02-20 15:00:00 +0000
2019-02-20T15:00:00.0000000
GroundFloorTestMeetingRoom1@qubbook.onmicrosoft.com
2019-02-20 15:00:00 +0000
2019-02-20T15:00:00.0000000

bookings:
FirstFloorTestMeetingRoom1@qubbook.onmicrosoft.com
2019-02-20 15:00:00 +0000
2019-02-20T15:00:00.0000000
gfprojectroom1@qubbook.onmicrosoft.com
2019-02-21 10:00:00 +0000
2019-02-21T10:00:00.0000000
gfprojectroom1@qubbook.onmicrosoft.com
2019-02-21 16:00:00 +0000
2019-02-21T16:00:00.0000000

filtered array:  [QUBook.MeetingSuggestion, QUBook.MeetingSuggestion]
email:  FirstFloorTestMeetingRoom1@qubbook.onmicrosoft.com
dstart:  2019-02-20 15:00:00 +0000
email:  GroundFloorTestMeetingRoom1@qubbook.onmicrosoft.com
dstart:  2019-02-20 15:00:00 +0000

По какой-то причине отфильтрованный массив совпадает с исходным meetingRoomSuggestions массив - он не отфильтровывает вхождение объекта с тем же dStart.Я подозреваю, что фильтр не так?Ранее я мог фильтровать массив объектов, сравнивая их с массивом строк и т. Д., Но не так.

1 Ответ

0 голосов
/ 20 февраля 2019

Вы используете какую-то обратную логику здесь.То, что вы должны сделать, это:

let filteredArr = meetingRoomSuggestions.filter { meeting in
    return !bookingArray.contains(where: { booking in
        return booking.dStart == meeting.dStart
    })
}

На простом английском языке: filter собрания, оставляя те, которые do not имеют свои значения dStart, равные значению dStart любого объекта вbookingArray.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...