如何从我的列表中删除重复项?

问题描述

我正在使用 SwiftUI 在视图中生成这个动态列表(显示生成列表的一部分):

  • 薰衣草
  • 柠檬
  • 石灰
  • 石灰
  • 芒果

如何从列表中删除重复项(例如 LIME)?

这是我生成列表视图的代码

struct FlavorGroupList: View {
    @Observedobject private var viewmodel = Flavorsviewmodel()
    var body: some View {
        List(viewmodel.flavors) { flavorListing in
            vstack(alignment: .leading) {
                Text(flavorListing.flavorGroup)
            }
        }
        .onAppear() {
            self.viewmodel.fetchData()
        }
    }
}

这是我的视图模型代码

class Flavorsviewmodel: ObservableObject {
    @Published var flavors = [Flavor]()
    private var db = Firestore.firestore()
    func fetchData() {
        db.collection("flavors").order(by: "flavorGroup").addSnapshotListener { (querySnapshot,error) in
            guard let documents = querySnapshot?.documents else {
                print("No documents")
                return
            }
            self.flavors = documents.compactMap { (queryDocumentSnapshot) -> Flavor? in
                return try? queryDocumentSnapshot.data(as: Flavor.self)
            }
        }
    }
}

这是我的模型代码

struct Flavor: Identifiable,Codable {
    @DocumentID var id: String? = UUID().uuidString
    var code: String
    var descriptors: [String]
    var flavorGroup: String
    var keywords: [String]
    var legislation: String
    var name: String
}

我正在从 Firestore 数据库导入数据。

预先感谢您提供的任何帮助。

解决方法

一种简单的方法是,先将数组 flavors 转换为 Set,然后再将其转换回数组。

class FlavorsViewModel: ObservableObject {
    @Published var flavors = [Flavor]()
    private var db = Firestore.firestore()
    func fetchData() {
        db.collection("flavors").order(by: "flavorGroup").addSnapshotListener { (querySnapshot,error) in
            guard let documents = querySnapshot?.documents else {
                print("No documents")
                return
            }
            self.flavors = documents.compactMap { (queryDocumentSnapshot) -> Flavor? in
                return try? queryDocumentSnapshot.data(as: Flavor.self)
            }
            self.flavors = Array(Set(flavors))//<- This line

        }
    }
}

请参阅文档以供参考:https://developer.apple.com/documentation/swift/set

,

您可以创建一个名为 Flavorunique 空数组,遍历检索到的风味并将它们添加到 unique 数组(如果它不存在使用 contains(where: _)

func removeDuplicates() -> [Flavor] {
    var unique = [Flavor]()
    self.flavors.forEach { flavor in
        if !unique.contains(where: {$0.name == flavor.name}) {
            unique.append(flavor)
        }
    }
    return unique
}