从对象数组中删除重复元素

剃须刀

我正在尝试删除 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]:在 Swift 中从数组中删除重复元素

舒巴姆·达拉姆瓦尔

您需要使事务对象可哈希。试试这个

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
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章