簡體   English   中英

基於對象屬性的任何對象的過濾器數組

[英]Filter Array of Any Object Based on Object Property

我收到這種格式的回復

[
    "1234": {
        "startDate": "1536278400",
        "endDate": "1536796800",
        "playerRank": 1,
        "performance": 100,
        "isProfit": false,
        "members": 1
    },
    "adityaKumar": {
        "startDate": "1536364800",
        "endDate": "1540080000",
        "playerRank": 1,
        "performance": 100,
        "isProfit": false,
        "members": 6
    },
    "madhu60": {
        "startDate": "1539388800",
        "endDate": "1539475200",
        "playerRank": 1,
        "performance": 100,
        "isProfit": false,
        "members": 2
    }
]

該響應的類型為[string:Any] 我必須使用playerRank屬性對數據進行排序。 我希望輸出為[string:Any]類型。

在Swift中這怎么可能?

字典未排序

快速文檔

字典在沒有定義順序的情況下將相同類型的鍵和相同類型的值之間的關聯存儲在集合中。

但是,您可以在字典上使用.sorted方法,這將為您提供字典數組(數組可排序)。

let sorted = dictionary.sorted(by: { ($0.value["playerRank"]) < ($1.value["playerRank"]) })

從您的原始示例sorted可能看起來像這樣

[
    (
      "key": "madhu60",
      "value": {
         "startDate": "1539388800",
         "endDate": "1539475200",
         "playerRank": 1,
         "performance": 100,
         "isProfit": false,
         "members": 2
      }
   )
   ....
]

解析了JSON ,您將獲得[String: [String:Any]]類型的dictionary ,即

let data = [
    "1234": [
        "startDate": "1536278400",
        "endDate": "1536796800",
        "playerRank": 1,
        "performance": 100,
        "isProfit": false,
        "members": 1
    ],
    "adityaKumar": [
        "startDate": "1536364800",
        "endDate": "1540080000",
        "playerRank": 1,
        "performance": 100,
        "isProfit": false,
        "members": 6
    ],
    "madhu60": [
        "startDate": "1539388800",
        "endDate": "1539475200",
        "playerRank": 1,
        "performance": 100,
        "isProfit": false,
        "members": 2
    ]
]

您可以使用sorted方法對字典進行sorted ,即

let sortedData = data.sorted { 
    if let rank1 = $0.value["playerRank"] as? Int, let rank2 = $1.value["playerRank"] as? Int
    {
        return rank1 < rank2
    }
    return false
}

而且你很好。

我在這里為您提供完整的答案。

首先將響應文本轉換為合格的JSON數據。

其次,構建定制的結構以將JSON數據解碼。

第三類結構

最后打印回原始響應文本(您可以使用字符串來獲取打印結果。)

第一:

            let json = """
    [
        "1234": {
            "startDate": "1536278400",
            "endDate": "1536796800",
            "playerRank": 4,
            "performance": 100,
            "isProfit": false,
            "members": 1
        },
        "adityaKumar": {
            "startDate": "1536364800",
            "endDate": "1540080000",
            "playerRank": 2,
            "performance": 100,
            "isProfit": false,
            "members": 6
        },
        "madhu60": {
            "startDate": "1539388800",
            "endDate": "1539475200",
            "playerRank": 1,
            "performance": 100,
            "isProfit": false,
            "members": 2
        }
    ]
    """.replacingOccurrences(of: "[", with: "{").replacingOccurrences(of: "]", with: "}").data(using: .utf8)

第二:

    struct Response  {
     struct ResponseData  {
        let name : String
         let startDate : String
         let endDate : String
         let performance : Int
         let playerRank : Int
         let isProfit : Bool
         let members : Int
        }
        var responseData: [ResponseData]
        init (responseData: [ResponseData] = []){
            self.responseData = responseData
        }
    }

     extension Response: Decodable {

        struct DataKey: CodingKey {
                    var stringValue: String
                    init?(stringValue: String) {
                        self.stringValue = stringValue
                    }
                    var intValue: Int? { return nil }
                    init?(intValue: Int) { return nil}

                    static let startDate = DataKey(stringValue: "startDate")!
                    static let endDate = DataKey(stringValue: "endDate")!
                    static let performance = DataKey(stringValue: "performance")!
                    static let playerRank = DataKey(stringValue: "playerRank")!
                    static let isProfit = DataKey(stringValue: "isProfit")!
                    static let members = DataKey(stringValue: "members")!
                }

        public init(from decoder: Decoder) throws {
            var responseData = [ResponseData]()
            let container = try decoder.container(keyedBy: DataKey.self)
            for key in container.allKeys {
                let dataContainer = try container.nestedContainer(keyedBy: DataKey.self, forKey: key)

                let startDate = try dataContainer.decode(String.self, forKey: .startDate)
                 let endDate = try dataContainer.decode(String.self, forKey: .endDate)
                 let performance = try dataContainer.decode(Int.self, forKey: .performance)
                 let playerRank = try dataContainer.decode(Int.self, forKey: .playerRank)
                 let isProfit = try dataContainer.decode(Bool.self, forKey: .isProfit)
                 let members = try dataContainer.decode(Int.self, forKey: .members)
                let each = ResponseData.init(name: key.stringValue, startDate: startDate, endDate: endDate, performance: performance, playerRank: playerRank, isProfit: isProfit, members: members)
                responseData.append(each)
            }
            self.init(responseData: responseData)
        }
    }

    let decoder = JSONDecoder()
    var decodedStore = try decoder.decode(Response.self, from: json!)

第三:

      decodedStore.responseData.sort{$0.playerRank < $1.playerRank }

持續:

     print ("[")
    for each in decodedStore.responseData {
        print ("""
               \(each.name): {
                        "startDate": \(each.startDate),
                        "endDate": \(each.endDate),
                        "playerRank": \(each.playerRank),
                        "performance": \(each.performance),
                        "isProfit": \(each.isProfit),
                        "members": \(each.members)
                        }
            """)
    }
    print ("]\n")

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM