【问题标题】:Remove duplicate elements from object array从对象数组中删除重复元素
【发布时间】:2021-02-25 23:42:42
【问题描述】:

我正在尝试删除我的 Transaction 对象的重复元素。事务正在从 Firestore 加载并显示在 UTableView 上。我试图遵循这个答案 [here][1] 但是我收到一个错误,即budgetData 不可散列。有没有办法可以删除具有相同“transId”的重复交易并返回更新的预算数据数组?

  var budgetData: [Transaction] = []

func loadCatTransactions(){
    if let catId = self.categoryId{
        guard let user = Auth.auth().currentUser?.uid else { return }
        print("userFromLoadChat::\(user)")
        db.collection("users").document(user).collection("Transactions")
            .whereField("catId", isEqualTo: catId)
            .getDocuments() {
                snapshot, error in
                if let error = error {
                    print("\(error.localizedDescription)")
                } else {
                    self.budgetData.removeAll()
                    for document in snapshot!.documents {
                        let data = document.data()
                        let title = data["name"] as? String ?? ""
                        let date = data["date"] as? String ?? ""
                        let amount = data["amount"] as? Double ?? 0
                        let id = data["transId"] as? String ?? ""

                        let trans = Transaction(catId:catId,title: title, dateInfo: date, image: UIImage.groceriesIcon, amount: amount)
                        self.budgetData.append(trans)
                        DispatchQueue.main.async {
                            self.tableView.reloadData()
                        }
                    }
                }
            }
    }
}
func uniq<S : Sequence, T : Hashable>(source: S) -> [T] where S.Iterator.Element == T {
    var buffer = [T]()
    var added = Set<T>()
    for elem in source {
        if !added.contains(elem) {
            buffer.append(elem)
            added.insert(elem)
        }
    }
    return buffer
}


  func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
 
    return self.budgetData.count
}

struct Transaction {
var catId : String? = nil
var title: String
var dateInfo: String
var image: UIImage
var amount: Double
var annualPercentageRate: Double?
var trailingSubText: String?
var uid: String?
var outOfString: String?
var category: String?
var dictionary:[String:Any]{
    return [
        "title": title,
        "dateInfo":dateInfo,
        "amount":amount,
        "annualPercentageRate":annualPercentageRate,
        "trailingSubText":trailingSubText,
        "uid": uid,
        "outOfString": outOfString,
        "category": category
    ]
}

} [1]:Removing duplicate elements from an array in Swift

【问题讨论】:

  • 你能显示你的Transaction模型的代码吗?
  • 在高层次上,我认为将您的结果加载到一个字典中,其中 transId 为键,事务为值,将为您提供一个包含唯一事务列表的字典。

标签: ios arrays swift google-cloud-firestore


【解决方案1】:

您需要将 Transaction 对象设为 Hashable。试试这个

struct Transaction{
     var transId: String
}
extension Transaction: Hashable{
     static func ==(lhs: Transaction, rhs: Transaction) -> Bool {
        return lhs.transId == rhs.transId
     }
 }


var budgetData = [Transaction(transId: "a"), Transaction(transId:"c"), 
                  Transaction(transId: "a"), Transaction(transId: "d")]
var tranSet = Set<Transaction>()
budgetData = budgetData.filter { (transaction) -> Bool in

   if !tranSet.contains(transaction){
      tranSet.insert(transaction)
      return true
    }
    return false
}

【讨论】:

  • Set insert 方法返回一个名为 inserted 的属性正是为此目的。顺便说一句,您可以使用RangeReplaceableCollection 变异方法removeAll(where:)。检查这个post ==> budgetData.removeAll{!set.insert($0).inserted}
猜你喜欢
  • 2018-03-29
  • 2018-02-26
  • 2020-01-31
  • 2013-05-20
  • 2011-07-03
  • 2017-03-21
  • 1970-01-01
  • 2018-05-30
相关资源
最近更新 更多