如果属性值存在于另一个对象数组中,则过滤对象数组

Lia*_*iam 2 arrays object filter swift

我有两个对象数组,如下所示:

MeetingRoomSuggestions:

init(suggestionReason: String, organizerAvailability: String,
startTime: String, endTime: String, dStart: Date, availability: String,
emailAddress: String, displayName: String, roomEmail: String,
occupancy: Int, building: String)
Run Code Online (Sandbox Code Playgroud)

Bookings

init(startTime: String, endTime: String, dStart: Date, organizer :
String, location : String, subject : String)
Run Code Online (Sandbox Code Playgroud)

MeetingRoomSuggestion如果数组dStart中存在该属性,我希望能够从数组中过滤/排除对象Bookings

我的代码:

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

我还尝试过滤起始字符串 - 两者都是相同的。当我在过滤之前打印出两个数组时 - 您可以清楚地看到存在具有相同的预订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)
        }
Run Code Online (Sandbox Code Playgroud)

返回:

    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
Run Code Online (Sandbox Code Playgroud)

由于某种原因,过滤后的数组与原始数组相同meetingRoomSuggestions- 它不会过滤掉具有相同dStart. 我怀疑过滤器有问题?我以前能够通过将对象数组与字符串数组等进行比较来过滤对象数组,但不是这样。

pck*_*ill 6

您在这里使用了某种反向逻辑。你应该做的是这样的:

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

用简单的英语来说:filter会议,留下那些do notdStart值等于dStart中任何对象的值的会议bookingArray