【问题标题】:Get Distinct Value based on "id" Paramerter in ios swift在ios swift中根据“id”参数获取不同的值
【发布时间】:2023-03-30 18:11:01
【问题描述】:

//这是我的模型

struct RestaurantItem : Codable {
        
    var v : Int?
    var id : String = ""
    let addOnList : [AddOnList]? 
    var createdAt : String = ""
    var orderType : Int?
    var productId : ProductId?
    var quantity : Int?
    var restaurantId : String = ""
    var specialInstructions : String = ""
    var updatedAt : String = ""
    var userId : String = ""
    
    enum CodingKeys: String, CodingKey {
        case v = "__v"
        case id = "_id"
        case addOnList = "addOnList"
        case createdAt = "createdAt"
        case orderType = "orderType"
        case productId = "productId"
        case quantity = "quantity"
        case restaurantId = "restaurantId"
        case specialInstructions = "specialInstructions"
        case updatedAt = "updatedAt"
        case userId = "userId"
    }
    
    init(from decoder: Decoder) throws {
        let values = try decoder.container(keyedBy: CodingKeys.self)
        v = try values.decodeIfPresent(Int.self, forKey: .v)
        id = try values.decodeIfPresent(String.self, forKey: .id) ?? ""
        if (try? values.decodeIfPresent(String.self, forKey: .addOnList)) == nil {
            self.addOnList = try values.decodeIfPresent([AddOnList].self, forKey: .addOnList)
        } else {
            self.addOnList = nil
        }
        createdAt = try values.decodeIfPresent(String.self, forKey: .createdAt) ?? ""
        orderType = try values.decodeIfPresent(Int.self, forKey: .orderType)
        quantity = try values.decodeIfPresent(Int.self, forKey: .quantity)
        restaurantId = try values.decodeIfPresent(String.self, forKey: .restaurantId) ?? ""
        specialInstructions = try values.decodeIfPresent(String.self, forKey: .specialInstructions) ?? ""
        updatedAt = try values.decodeIfPresent(String.self, forKey: .updatedAt) ?? ""
        userId = try values.decodeIfPresent(String.self, forKey: .userId) ?? ""
        
        if (try? values.decodeIfPresent(String.self, forKey: .productId)) == nil {
            self.productId = try values.decodeIfPresent(ProductId.self, forKey: .productId)
        } else {
            self.productId = nil
        }
    }
    }

视图控制器中的声明

 var restaurantItems : [RestaurantItem]?

// 这个数组包含基于“id”的重复值,我怎样才能得到一个没有复制数据的新数组

【问题讨论】:

  • 为什么会有重复?服务器响应重复?或者你追加太多次,你得到重复?您可以根据 id 创建一个字典,然后检索该值。但是顺序对你来说重要吗?
  • @Larme 服务器提供重复数据。我知道这是服务器端故障,但现在没有人可以更改此数据复制。我必须自己管理它。是的,订单很重要
  • 你想在什么基础上过滤掉重复的id?
  • @PGDev [0] = { productId = some { restaurantId = some { id = "5ed05bd5aa47246104f8c0fc" PName = “food” } } } [1] = { productId = some { restaurantId = some { id = "5ed05bd5aa47246104f8c0fc" PName = "drink" } } } 因为 id 相同,所以我只想考虑 1 而不是 2。因为餐厅 id 相同,所以它们是同一家餐厅的产品

标签: ios swift model-view-controller


【解决方案1】:

您可以使用 Dictionary.init(grouping:by:) 过滤掉重复值,即

if let items = restaurantItems {
    let arr = Dictionary(grouping: items){ $0.id }.values.first.flatMap{ $0 }
    print(arr)
}

【讨论】:

  • cmets 中的作者:“是的,顺序很重要”,我知道,“细节”应该在问题中。
  • if let items = self.restaurantItems { self.arrRestaurant = Dictionary(grouping: items){ $0.productId?.restaurantId?.id }.values.first.flatMap{ $0 } print(self. arr餐厅)}
  • restaurantId = some { id = "5ed05bd5aa47246104f8c0fc"
  • 这是重复的。 3次 。但需要一个结果
  • @PGDev if let items = self.restaurantItems { self.arrRestaurant = Dictionary(grouping: items){ $0.productId?.restaurantId?.id }.values.first.flatMap{ $0 } print( self.arrRestaurant) }。它包含所有值而不是唯一值
【解决方案2】:

如果你的 struct 符合 Hashable 协议并使用 id 作为哈希值。您可以使用这个不错的扩展来为您提供一个独特的数组。

    extension Array where Element : Hashable {
        var unique: [Element] {
            return Array(Set(self))
        }
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-10
    • 1970-01-01
    • 2013-01-21
    • 2019-12-03
    • 1970-01-01
    • 2021-12-16
    相关资源
    最近更新 更多