【问题标题】:Filter array of objects if property value exists in another array of objects swift如果属性值存在于另一个对象数组中,则过滤对象数组
【发布时间】:2019-07-14 06:36:57
【问题描述】:

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

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)

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

我的代码:

  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 的对象的出现。我怀疑过滤器有问题?我以前能够通过将对象数组与字符串数组等进行比较来过滤对象数组,但不是这样。

【问题讨论】:

  • 在 MeetingRoomSuggestions init 你在哪里初始化 dstart ??

标签: arrays swift object filter


【解决方案1】:

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

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

简而言之:filter 会议,让do notdStart 值等于bookingArray 中任何对象的dStart 值。

【讨论】:

  • 编辑了我的答案。我首先尝试了这种过滤方式,但它不会过滤掉我想要的会议。即使有相同 dStart 的预订,也不会接听/过滤? ^ 见上面的印刷品
  • @Liam,我想你忘了!,就像!bookingArray.contains一样
  • @LeoDabus,好吧,我不这么认为。至少在向某人解释某事时不会。
  • @LeoDabus,不,我不会。这不是一个优雅的地方,这有点违背隐式返回的唯一目的。
  • @Liam,当然,根据您的要求随意调整过滤器逻辑
猜你喜欢
  • 1970-01-01
  • 2022-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-01
  • 2020-11-19
相关资源
最近更新 更多