【问题标题】:swift filter array produces duplicates (How to remove filter duplicates)快速过滤器数组产生重复项(如何删除过滤器重复项)
【发布时间】:2019-08-16 07:10:01
【问题描述】:

我使用从 Firebase 数据库中检索到的数据创建了一个按日期过滤的消息。我的目标是为相应的消息组制作标题部分。

struct dateModelStructure {
        var date: String
        var contents: String
    }
var messagesPerDateDictionary: [dateModelStructure] = []
var dateSection = [Any]()
var array = [Any]()
array = self.messagesPerDateDictionary.filter { $0.date == chat.datestampString()}
self.dateSection.append(array)

问题是如果我将数组附加到 dateSection,它会附加整个重复数据。例如,

[
[ChatViewController.dateModelStructure(date: "2019-08-13", contents: "Why did you call me a fat cat?")], 
[ChatViewController.dateModelStructure(date: "2019-08-13", contents: "Why did you call me a fat cat?"), ChatViewController.dateModelStructure(date: "2019-08-13", contents: "Um...my chat..where did it go?")], 
[ChatViewController.dateModelStructure(date: "2019-08-13", contents: "Why did you call me a fat cat?"), ChatViewController.dateModelStructure(date: "2019-08-13", contents: "Um...my chat..where did it go?"), ChatViewController.dateModelStructure(date: "2019-08-13", contents: "Thank you")], 
[ChatViewController.dateModelStructure(date: "2019-08-14", contents: "https://firebasestorage.googleapis.com/v0/b/tikitalka-a8e51.appspot.com/o/message_images%2FDF89F565-9BDB-442F-83B4-B5D6E0BD0739?alt=media&token=9d54f505-50ce-45f5-999e-2d7c6981ec20")], 
[ChatViewController.dateModelStructure(date: "2019-08-14", contents: "https://firebasestorage.googleapis.com/v0/b/tikitalka-a8e51.appspot.com/o/message_images%2FDF89F565-9BDB-442F-83B4-B5D6E0BD0739?alt=media&token=9d54f505-50ce-45f5-999e-2d7c6981ec20"), ChatViewController.dateModelStructure(date: "2019-08-14", contents: "https://firebasestorage.googleapis.com/v0/b/tikitalka-a8e51.appspot.com/o/message_movies%2F155A8712-F437-4B3E-AE76-97ECA1C3A4B6.mov?alt=media&token=a12c4f7f-d46a-4109-ace0-97bdacaf04cf")], 
[ChatViewController.dateModelStructure(date: "2019-08-15", contents: "Counts")]
]

如果我只是想要这样的东西,我该怎么办。

[ 
[ChatViewController.dateModelStructure(date: "2019-08-13", contents: "Why did you call me a fat cat?"), ChatViewController.dateModelStructure(date: "2019-08-13", contents: "Um...my chat..where did it go?"), ChatViewController.dateModelStructure(date: "2019-08-13", contents: "Thank you")],  
[ChatViewController.dateModelStructure(date: "2019-08-14", contents: "https://firebasestorage.googleapis.com/v0/b/tikitalka-a8e51.appspot.com/o/message_images%2FDF89F565-9BDB-442F-83B4-B5D6E0BD0739?alt=media&token=9d54f505-50ce-45f5-999e-2d7c6981ec20"), ChatViewController.dateModelStructure(date: "2019-08-14", contents: "https://firebasestorage.googleapis.com/v0/b/tikitalka-a8e51.appspot.com/o/message_movies%2F155A8712-F437-4B3E-AE76-97ECA1C3A4B6.mov?alt=media&token=a12c4f7f-d46a-4109-ace0-97bdacaf04cf")], 
[ChatViewController.dateModelStructure(date: "2019-08-15", contents: "Counts")]
]

如果我的问题不够清楚,我深表歉意。 谢谢你的帮助!

【问题讨论】:

  • 让arrayUnordered = Array(Set(array))
  • 让arrayOrdered = Array(NSOrderedSet(array:array))
  • 据我所知,问题不在于filter。当messagesPerDateDictionary 附加了新内容时,您似乎正在执行过滤器。字典包含所有内容后执行过滤器应该可以解决您的问题
  • 这对我来说看起来有点未完成。如果您考虑与 Firebase 连接聊天,您可能希望使用时间戳而不是仅使用 YYYY-MM-DD。您如何过滤同一天的不同对话? filter 产生重复也完全没问题,因为它只是根据给定的要求进行过滤。
  • @zero3nna 你是对的。当我弄清楚如何删除数组中的所有重复项时,我将使用时间戳进行排序:)

标签: arrays swift date struct filter


【解决方案1】:

这是我在操场上想到的。我希望我正确理解了您的问题:

class ChatViewController {

    struct dateModelStructure: Hashable {
        var date: String
        var contents: String

        static func ==(lhs: ChatViewController.dateModelStructure, rhs: ChatViewController.dateModelStructure) -> Bool {
            return lhs.date == rhs.date && lhs.contents == rhs.contents
        }
    }

    var messagesPerDateDictionary: [dateModelStructure] = []
    var dateSection = [Any]()
}

var someData = [
    [ChatViewController.dateModelStructure(date: "2019-08-13", contents: "Why did you call me a fat cat?")],
    [ChatViewController.dateModelStructure(date: "2019-08-13", contents: "Why did you call me a fat cat?"),ChatViewController.dateModelStructure(date: "2019-08-13", contents: "Um...my chat..where did it go?")],
    [ChatViewController.dateModelStructure(date: "2019-08-13", contents: "Why did you call me a fat cat?"), ChatViewController.dateModelStructure(date: "2019-08-13", contents: "Um...my chat..where did it go?"), ChatViewController.dateModelStructure(date: "2019-08-13", contents: "Thank you")],
    [ChatViewController.dateModelStructure(date: "2019-08-14", contents: "https://firebasestorage.googleapis.com/v0/b/tikitalka-a8e51.appspot.com/o/message_images%2FDF89F565-9BDB-442F-83B4-B5D6E0BD0739?alt=media&token=9d54f505-50ce-45f5-999e-2d7c6981ec20")],
    [ChatViewController.dateModelStructure(date: "2019-08-14", contents: "https://firebasestorage.googleapis.com/v0/b/tikitalka-a8e51.appspot.com/o/message_images%2FDF89F565-9BDB-442F-83B4-B5D6E0BD0739?alt=media&token=9d54f505-50ce-45f5-999e-2d7c6981ec20"), ChatViewController.dateModelStructure(date: "2019-08-14", contents: "https://firebasestorage.googleapis.com/v0/b/tikitalka-a8e51.appspot.com/o/message_movies%2F155A8712-F437-4B3E-AE76-97ECA1C3A4B6.mov?alt=media&token=a12c4f7f-d46a-4109-ace0-97bdacaf04cf")],
    [ChatViewController.dateModelStructure(date: "2019-08-15", contents: "Counts")]
]

var helperDict = [String: [ChatViewController.dateModelStructure]]()

someData.forEach { (data) in
    guard let firstDate = data.first?.date else {
        return
    }
    if let existingArray = helperDict[firstDate] {
        helperDict[firstDate] = existingArray + data
    } else {
        helperDict[firstDate] = data
    }
}

var filtered : [[ChatViewController.dateModelStructure]] = helperDict.values.reduce([[ChatViewController.dateModelStructure]]()) { (previous, current) -> [[ChatViewController.dateModelStructure]] in
    var next = [Array(Set(current))] + previous
    return next
}



filtered.forEach { (items) in
    print ("------------------------------")
    items.forEach({ (item) in
        print(item)
    })
}

------------------------------
dateModelStructure(date: "2019-08-14", contents: "https://firebasestorage.googleapis.com/v0/b/tikitalka-a8e51.appspot.com/o/message_images%2FDF89F565-9BDB-442F-83B4-B5D6E0BD0739?alt=media&token=9d54f505-50ce-45f5-999e-2d7c6981ec20")
dateModelStructure(date: "2019-08-14", contents: "https://firebasestorage.googleapis.com/v0/b/tikitalka-a8e51.appspot.com/o/message_movies%2F155A8712-F437-4B3E-AE76-97ECA1C3A4B6.mov?alt=media&token=a12c4f7f-d46a-4109-ace0-97bdacaf04cf")
------------------------------
dateModelStructure(date: "2019-08-13", contents: "Why did you call me a fat cat?")
dateModelStructure(date: "2019-08-13", contents: "Um...my chat..where did it go?")
dateModelStructure(date: "2019-08-13", contents: "Thank you")
------------------------------
dateModelStructure(date: "2019-08-15", contents: "Counts")

此代码可以改进,但如果它为您提供了您正在搜索的结果,请告诉我。

【讨论】:

    猜你喜欢
    • 2016-09-16
    • 2021-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-23
    • 2021-12-07
    • 1970-01-01
    相关资源
    最近更新 更多