[英]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.